ATL:多个接口控件打包时的CLSID 自己写的ATL ActiveX控件,里面有3个接口,打成CAB包时,DLL的clsid应该是哪个,网上人说是coclass的uuid,如果有3个接口,就有三个uuid,到底应该写哪个呢。网上有人说随便写一个都可以,到时候能够通过一个接口找到其他接口,是这样吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果DLL的clsid时coclass的uuid,那么当一个组件DLL中有多个接口时,就会有多个coclass,那么这个时候clsid应该选择哪个uuid呢。 就是我在我的一个DLL中添加了多个ATL简单对象,xgc2067598所指的组件是这个简单对象吗?因为没添加一个ATL简单对象,在IDL文件中就会多一个coclass,所以不清楚最后DLL的clsid到底应该写哪个uuid。 有多个class 就有多个CLSID,就是多个组件,可以从tlb中获取CLSID。cocreateinstance 工具不同的CLSID创建不同的组件。。 试试在inf里为每个clsid添加单独的section,有一个 clsid加一个section如果不行,就换个设计方法,比如设计IApplicatoin,其他接口都从这个接口中获取。类似ms office那样 cab只是打个包而已在你引用cab文件的地方,你要用哪个COM对象就写哪个对象的clsid例如你在网页引用,就写你要用的对象的clsid sgzwiz能不能细说下。我的具体情况是这样:import "oaidl.idl";import "ocidl.idl";[ object, uuid(****), dual, nonextensible, helpstring("myInterfaceA 接口"), pointer_default(unique)]interface myInterfaceA : IDispatch{ 。};[ object, uuid(****), dual, nonextensible, helpstring("myInterfaceB 接口"), pointer_default(unique)]interface myInterfaceB: IDispatch{ .....};[ object, uuid(****), dual, nonextensible, helpstring("myInterfaceC 接口"), pointer_default(unique)]interface myInterfaceB : IDispatch{ .....};[ uuid(****), version(1.0), helpstring("myActiveX 1.0 类型库")]library myActiveXLib{ importlib("stdole2.tlb"); [ uuid(****), helpstring("_I****Events 接口") ] dispinterface _I****Events { properties: methods: }; [ uuid(****), helpstring("myInterfaceA Class") ] coclass myInterfaceA { [default] interface I***; [default, source] dispinterface _I****Events; }; [ uuid(****), helpstring("_I****Events 接口") ] dispinterface _I****Events { properties: methods: }; [ uuid(****), helpstring("myInterfaceB Class") ] coclass myInterfaceB { [default] interface ImyInterfaceB; [default, source] dispinterface _I****Events; }; [ uuid(****), helpstring("_I****Events 接口") ] dispinterface _I****Events { properties: methods: }; [ uuid(****), helpstring("myInterfaceC Class") ] coclass myInterfaceC { [default] interface ImyInterfaceC; [default, source] dispinterface _I****Events; };}; 里面有三个接口:myInterfaceA,myInterfaceB,myInterfaceC,分别对应了三个coclass,我这打CAB包时,INF文件中写的是myInterfaceA的uuid,在调用控件的html页面中<object clsid=“****”>也是写的myInterfaceA的这个uuid。但是貌似有一个问题,在js里面调用接口的时候,IE6下面只会提示下载一次,在IE7下面new myInterfaceA()会提示下载,new myInterfaceB,new myInterfaceC也会提示下载,就是说对每个接口都会提示下载注册一次。 一個文件中包含多個組件的話,打包時隨意寫哪個組件的CLSID都可以,系統注冊組件時會自動查找單個文件中包含的多個組件,并且分別注冊。 嗯,楼上的说法我在书上也看到有说。但是在IE6里面是可以随便写一个CLSID,其他接口就可以调用了;在IE7里不行,如果写的是A接口的CLSID,那么安装时貌似只注册了接口A,当用到B接口时,又会弹出框,问是否要安装控件。这个不知如何搞定。按理说也是能够自动找到的。 IE7下還真沒遇到過這樣的問題,要不然你乾脆寫3個<object>標記,把3個CLSID都寫進去,如果你得組件有界面,把不需要顯示的讓它隱藏就好了。不過,建議如果是通過IE分發ACTIVEX控件的話,最好是單個文件里只包含一個組件 注册DLL的时候,你dll中的组件都注册了。。 inf文件这么写就行了,把clsid后面的XXX替换成你得多个组件clsid就行了[version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] XXXX.dll=XXXX.dll [XXXX.dll] file-win32-x86=thiscab clsid={XXXX-XXXX-XXXX} FileVersion=1,1,0,0 RegisterServer=yes[XXXX.dll] file-win32-x86=thiscab clsid={XXXX-XXXX-XXXX} FileVersion=1,1,0,0 RegisterServer=yes 楼上的方法貌似不行。现在的现象是:myInterfaceA,myInterfaceB,myInterfaceC三个接口,在inf文件中写myInterfaceA的clsid,在js页面中<object clsid=“****”...>也时myInterfaceA的clsid,这样在IE6下面没有问题,在IE7和IE8中,首次调用myInterfaceB,myInterfaceC接口时,浏览器会提示,是否允许运行该控件,如果允许,以后就不会再提示了,这个是不是IE7、IE8中增强了安全检查,但是myInterfaceA接口从第一次使用就不会有提示。 编译能通过,但是连接报错 找个带薪实习的岗位 DLL动态库创建的非模态窗口如何实现消息循环? 如何在程序中修改另一个特定EXE程序的资源、比如字符串 VC中解决图像重绘的问题? 谈谈关于工作的事情(当然有分拿) 急!在线等!如何得到动态创建的控件的ID? 如何显示一个三维函数的图形? 如何将CBitmap类中的内容存为BMP文件 请教一个小问题, WSASend 发送数据包问题 ActiveX控件使IE假死等待 STA和MTA的奇怪问题,求解!
cocreateinstance 工具不同的CLSID创建不同的组件。。
如果不行,就换个设计方法,比如设计IApplicatoin,其他接口都从这个接口中获取。类似ms office那样
cab只是打个包而已在你引用cab文件的地方,你要用哪个COM对象就写哪个对象的clsid
例如你在网页引用,就写你要用的对象的clsid
我的具体情况是这样:
import "oaidl.idl";
import "ocidl.idl";[
object,
uuid(****),
dual,
nonextensible,
helpstring("myInterfaceA 接口"),
pointer_default(unique)
]
interface myInterfaceA : IDispatch{
。
};[
object,
uuid(****),
dual,
nonextensible,
helpstring("myInterfaceB 接口"),
pointer_default(unique)
]
interface myInterfaceB: IDispatch{
.....
};[
object,
uuid(****),
dual,
nonextensible,
helpstring("myInterfaceC 接口"),
pointer_default(unique)
]
interface myInterfaceB : IDispatch{
.....
};[
uuid(****),
version(1.0),
helpstring("myActiveX 1.0 类型库")
]
library myActiveXLib
{
importlib("stdole2.tlb");
[
uuid(****),
helpstring("_I****Events 接口")
]
dispinterface _I****Events
{
properties:
methods:
};
[
uuid(****),
helpstring("myInterfaceA Class")
]
coclass myInterfaceA
{
[default] interface I***;
[default, source] dispinterface _I****Events;
};
[
uuid(****),
helpstring("_I****Events 接口")
]
dispinterface _I****Events
{
properties:
methods:
};
[
uuid(****),
helpstring("myInterfaceB Class")
]
coclass myInterfaceB
{
[default] interface ImyInterfaceB;
[default, source] dispinterface _I****Events;
};
[
uuid(****),
helpstring("_I****Events 接口")
]
dispinterface _I****Events
{
properties:
methods:
};
[
uuid(****),
helpstring("myInterfaceC Class")
]
coclass myInterfaceC
{
[default] interface ImyInterfaceC;
[default, source] dispinterface _I****Events;
};
};
但是貌似有一个问题,在js里面调用接口的时候,IE6下面只会提示下载一次,在IE7下面new myInterfaceA()会提示下载,new myInterfaceB,new myInterfaceC也会提示下载,就是说对每个接口都会提示下载注册一次。
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
XXXX.dll=XXXX.dll
[XXXX.dll]
file-win32-x86=thiscab
clsid={XXXX-XXXX-XXXX}
FileVersion=1,1,0,0
RegisterServer=yes[XXXX.dll]
file-win32-x86=thiscab
clsid={XXXX-XXXX-XXXX}
FileVersion=1,1,0,0
RegisterServer=yes
myInterfaceA,myInterfaceB,myInterfaceC三个接口,在inf文件中写myInterfaceA的clsid,在js页面中<object clsid=“****”...>也时myInterfaceA的clsid,这样在IE6下面没有问题,在IE7和IE8中,首次调用myInterfaceB,myInterfaceC接口时,浏览器会提示,是否允许运行该控件,如果允许,以后就不会再提示了,这个是不是IE7、IE8中增强了安全检查,但是myInterfaceA接口从第一次使用就不会有提示。