制作并导出ActiveX对象需要做以下事情:
初始化要导出的对象
初始化OLE。
要使用COM的剪贴板、拖放、OLE和In-place激活等功能,必须先初始化COM库。
CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式。参数必须为NULL。
CoInitializeEx(LPVOID),新版本,可以用参数指定协同模式,如多线程模式,但。
注意单元的协同模式是不能改的,如果在已经初始化为多线程的单元里初始化OLE将失败并返回RPC_E_CHANGED_MODE。
每个线程只要调用一次初始化就够了,同一线程中的后续调用也将通过,但会返回S_FALSE。
后面解除初始化调用要与本调用一一对应,返回S_FALSE的CoInitialize调用也计算在内。
应用程序的第一个线程将调用CoInitializeEx(COINIT_APARTMENTTHREADED或0),必须是最后一个解除初始化的。
如果不按上面的顺序进行初始化/解除函数调用,在该单线程单元(STA)里后续的初始化调用将失败,应用程序将无法工作。
由于无法控制本地服务器的载入/御载顺序,在DLLMain里调用初始化/解除函数是不安全的。
注册要导出的对象的类工厂。
类工厂为客户端创建活动对象实例,必须先注册到系统中以便客户端引用。
多用途EXE型对象应用程序必须先建立类对象(with IClassFactory接口)。
CoRegisterClassObject为EXE型对象注册到OLE以便其它应用可以连接上它。EXE对象应用程序应当在启动时就调用它。
如果EXE或EXE用到的DLL需要用到一些内部对象,也可用CoRegisterClassObject来注册。
对象处理器(Handler)或DLL型应用不可调用CoRegisterClassObject,而应实现并输出DLLGetClassObject方法
注册活动对象(active object).
RegisterActiveObject(Unknown FAR* punk, REFCLSID rclsid, DWORD dwFlags, unsigned long FAR* pdwRegister );用于注册活动对象。
参数punk指向的对象被注册为clsid代表类型的活动对象(ActiveObject)。
注册导致该对象被列表到COM系统的正在运行对象表(ROT)中。该查找表用来跟踪系统中当前运行着的对象。
Active对象可以用两种方式停止:
可视对象:收到来自GUI或Client端的终止命令(Quit、Exit等)时。
不可视对象:最后一个外部连接消失时。
Active对象可以用强、弱两种方式进行注册,默认为强注册。
ACTIVEOBJECT_STRONG:在对象上执行AddRef,使ROT中的对象与对应的Stub引用计数加一,需要使用RevokeActiveObject显式从表中解除。
ACTIVEOBJECT_WEEK:在ROT中建立对象指针,但不增加引用计数,因此当指向弱对象的最后一个外部连接消失时,COM系统将释放对象的Stub,对象本身也不再可用。
要确保得到渴望的行为,不仅要考虑OLE的标准活动,还要考虑以下活动:
尽管代码可以编写不可视对象,该对象随还是有可能变成可视。一旦变得可视,它将保持可视、活动,直到显式收到GUI或Client的终止命令。这在代码中的引用消失时就可能发生。
其它的ActiveX对象可能使用该对象。如果是这样,该代码不应该强制对象终止。
为避免可能出现的冲突,应该总是将ActiveX对象注册为ACTIVEOBJECT_WEEK,必要时还要调用CoLockObjectExternal确保对象保持活动。
绝大多数情况下,当ActiveX对象变得可视时应该调用CoLockObjectExternal,以保证对象处于活动状态,直到用户要求它停止。终止一个Active对象应当遵循以下步骤:
当对象可视时为用户锁定对象:CoLockObjectExternal(punk, TRUE, TRUE)
当用户要求终止对象时解锁:CoLockObjectExternal(punk, FALSE, FALSE)
调用RevokeActiveObject停止对象活动
如果要结束所有远程进程对该对象的链接:CoDisconnectObject(punk, 0)
===================================
ActiveX文档在WEB上的应用
向WEB页面中加入ActiveX文档,首先要将该ActiveX文档包装成CAB文件。由于InternetExplorer读入ActiveX文档时,该文档将取代当前的WEB页,因此,一般将ActiveX文档(即HTML的标记OBJECT)放在一个独立的HTML文件中。例如,下面这条语句建立了一个超链接:
<AhRef="ActiveXDoc.htm">LinktoaActiveXDocument</A>
其中,ActiveXDoc.htm是下载ActiveX文档的HTML文件:
<OBJECT
classid="clsid:2F390484-1C7D-11D0-8908-00A0C90395F4"
codebase="ActiveXDoc.cab#version=1,0,0,0">
</OBJECT>
这条语句将下载ActiveXDoc.cab,并在Windows注册表中注册该ActiveX文档。
14、VisualBasic代码部件在WEB上的应用
VisualBasic代码部件包括ActiveXDLL和ActiveXEXE,它们可以在服务器端运行,也可以从客户端下载再运行。
如果某个ActiveXDLL运行在服务器端,服务器上运行的是InternetInformationServer,则可以使用VB的OLEISAPI2.DLL提供的函数进行访问,或者基于ActiveServerPages使用VBScript或者JScript。
如果希望客户端下载某个代码部件,则首先要将该部件包装成CAB文件。例如,用VB5.0企业版生成了一个ActiveXDLL:MyDLL.DLL,它只有一个类:MyClass,其唯一的方法是显示LogIn对话框。用SetupWizard包装这个部件,生成了CAB文件。下面的语句将在客户端下载MYDLL.CAB:
<OBJECTID=MyClass
CLASSID="CLSID:503B3E09-2191-11D2-8E90-00104B64F7B7"
CODEBASE="mydll.cab">
</OBJECT>
<INPUTTYPE=buttonVALUE="LogInNOW"NAME="BtnLogin">
<!--
Whenthebuttonisclicked,callthe"LogIn"method.
-->
<SCRIPTlanguage="VBScript">
<!--
SubWindow_OnLoad
MyClass.Login
EndSub
SubBtnLogin_OnClick()
MyClass.Login
EndSub
-->
</Script>
其中,ObjectID是这个ActiveXDLL中某个类的名字。当此WEB页面被下载并显示时,MyClass类的方法LogIn将被调用,并在客户端显示LogIn对话框。
15、VisualBasic6.0
Microsoft计划于1998年9月推出VisualBasic6.0。目前Beta版正在测试。VB6.0与VB5.0相比,除继续支持InternetExplorerDocumentObjectModel(DOM)开发之外,将提供两个令人兴奋的新功能:
*DynamicHTML编辑器
开发人员可以象编制普通VB程序一样,制作DHTML文件或模板。
*WebClasses;
开发人员可以在WEB服务器端建立与ASP文件一一对应的WebClass类,每个类都可以访问ASP对象,在VisualBasicIDE中跟踪调试,并生成ISAPI动态连接库。
(责任编辑:机器AI) |