自己写的ATL ActiveX控件,里面有3个接口,打成CAB包时,DLL的clsid应该是哪个,网上人说是coclass的uuid,如果有3个接口,就有三个uuid,到底应该写哪个呢。网上有人说随便写一个都可以,到时候能够通过一个接口找到其他接口,是这样吗?

解决方案 »

  1.   

    如果DLL的clsid时coclass的uuid,那么当一个组件DLL中有多个接口时,就会有多个coclass,那么这个时候clsid应该选择哪个uuid呢。
      

  2.   

    就是我在我的一个DLL中添加了多个ATL简单对象,xgc2067598所指的组件是这个简单对象吗?因为没添加一个ATL简单对象,在IDL文件中就会多一个coclass,所以不清楚最后DLL的clsid到底应该写哪个uuid。
      

  3.   

    有多个class 就有多个CLSID,就是多个组件,可以从tlb中获取CLSID。
    cocreateinstance 工具不同的CLSID创建不同的组件。。
      

  4.   

    试试在inf里为每个clsid添加单独的section,有一个 clsid加一个section
    如果不行,就换个设计方法,比如设计IApplicatoin,其他接口都从这个接口中获取。类似ms office那样
      

  5.   


    cab只是打个包而已在你引用cab文件的地方,你要用哪个COM对象就写哪个对象的clsid
    例如你在网页引用,就写你要用的对象的clsid
      

  6.   

    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;
    };
    };
      

  7.   

    里面有三个接口:myInterfaceA,myInterfaceB,myInterfaceC,分别对应了三个coclass,我这打CAB包时,INF文件中写的是myInterfaceA的uuid,在调用控件的html页面中<object clsid=“****”>也是写的myInterfaceA的这个uuid。
    但是貌似有一个问题,在js里面调用接口的时候,IE6下面只会提示下载一次,在IE7下面new myInterfaceA()会提示下载,new myInterfaceB,new myInterfaceC也会提示下载,就是说对每个接口都会提示下载注册一次。
      

  8.   

    一個文件中包含多個組件的話,打包時隨意寫哪個組件的CLSID都可以,系統注冊組件時會自動查找單個文件中包含的多個組件,并且分別注冊。
      

  9.   

    嗯,楼上的说法我在书上也看到有说。但是在IE6里面是可以随便写一个CLSID,其他接口就可以调用了;在IE7里不行,如果写的是A接口的CLSID,那么安装时貌似只注册了接口A,当用到B接口时,又会弹出框,问是否要安装控件。这个不知如何搞定。按理说也是能够自动找到的。
      

  10.   

    IE7下還真沒遇到過這樣的問題,要不然你乾脆寫3個<object>標記,把3個CLSID都寫進去,如果你得組件有界面,把不需要顯示的讓它隱藏就好了。不過,建議如果是通過IE分發ACTIVEX控件的話,最好是單個文件里只包含一個組件
      

  11.   

    注册DLL的时候,你dll中的组件都注册了。。
      

  12.   

    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
      

  13.   

    楼上的方法貌似不行。现在的现象是:
    myInterfaceA,myInterfaceB,myInterfaceC三个接口,在inf文件中写myInterfaceA的clsid,在js页面中<object clsid=“****”...>也时myInterfaceA的clsid,这样在IE6下面没有问题,在IE7和IE8中,首次调用myInterfaceB,myInterfaceC接口时,浏览器会提示,是否允许运行该控件,如果允许,以后就不会再提示了,这个是不是IE7、IE8中增强了安全检查,但是myInterfaceA接口从第一次使用就不会有提示。