|
释放不只须decrement 对象数, 但当这计数为零时它必需删除对象, 和删除dll 的对象数(这样当对象计数为零dll也许被卸载) 。再次, 这种实施是琐细的:
Release_MC proc this_:DWORD
mov eax, this_
dec (MyComObject ptr [eax]).nRefCount
mov eax, (MyComObject ptr [eax]).nRefCount
.IF (eax == 0)
; 参考计数下降到零
; 对象没有被提到
; 因此我们删除它
invoke CoTaskMemFree, this_
dec MyCFObject.nRefCount
xor eax, eax ; 清除eax (count = 0)
.ENDIF
ret ; note we return the object count
Release_MC endp
MyCom也是要实施的一个琐细接口。 MyCom对象有一名额外成员’价值’特性被保持。
GetValue proc this_:DWORD, pval:DWORD
mov eax, this_
mov eax, (MyComObject ptr [eax]).nValue
mov edx, pval
mov [edx], eax
xor eax, eax ; 返回 S_OK
ret
GetValue endp
SetValue proc this_:DWORD, val:DWORD
mov eax, this_
mov edx, val
mov (MyComObject ptr [eax]).nValue, edx
xor eax, eax ; 返回S_OK
ret
SetValue endp
RaiseValue PROC this_:DWORD, val:DWORD
mov eax, this_
mov edx, val
add (MyComObject ptr [eax]).nValue, edx
xor eax, eax ; 返回S_OK
ret
RaiseValue ENDP
MyCom.dll, 服务器代码
建立COM 服务器时,使用快速编辑之下编写用的BLDDLL.BAT文件在"\masm32\COM\BIN" 中。 我建议您改变包括"Build DLL"选择在内编辑菜单设置。
这项工程要求建造它5个文件:
MyCom.asm 给项目主要汇编代码
MyCom.idl接口定义文件,必须被编辑到MyCom.tlb
MyCom.tlb 类型库,作为一种必要资源
rsrc.rc资源文件, 让类型库使用进入资源
MyCom.DEF标准DLL输出文件
一旦编写, 这个代码什么也没做, 直到您登记它。 最容易方式打开一个组件给dll的文件夹,并且运行:regsvr32 MyCom.dll. 或者,我提供bat文件.r.bat和 u.bat记录未登记, respectivly, MyCom零部件。
通过regsvr32 运转MyCom.dll将产生DllRegisterServer并且写登记我们的信息,因此我们能 ...
从Visual Basic 访问服务器
保证绘制了封闭区,因此邻点实际上没看见您拥有Visual.basic 。打开VB并且开始一项标准.Exe工程。在菜单里寻找工程 | 参考并点击它。 纸卷通过名单检查MyCom组件, 并且点击没问题。 这给VB 应用增加类ID, 并且VB 将为关于服务器的详细资料检查类型库。
以形式设计者,把textboxes Text1 和Text2 增加到Form1, 然后增加一个命令按钮Command1 。 改变提高命令标题。 现在在Form1 编码区增加以下内容:
Option ExplicIT
Private MC As New MyCom
Private Sub Command1_Click()
MC.Raise (Text2) Text1 = MC.Value
End Sub
Private Sub Form_Load()
Set MC = New MyCom
MC.Value = 100
Text1 = MC.Value
End Sub
现在你通过点击新加按钮能运转应用测试服务器。一定小心,有无失误检查看看是否你把有效的数目放进Text2。你看见的是运转一台汇编语言服务器的Visual Basic。
注意可供下载的抽样程序有些是更加复杂的,为测试建立两个服务器对象。这证明每个物体能取它自己的私人数据信息。这台服务器很多不全部是十分真实的,但这是从汇编到充分的COM功能起步。 上一页 [1] [2] [3] |