先写了一个idl,用midl编译后,
得到tlb,在vb中 建立active dll,引用tlb,创建了一个类实现这个接口
(因为主要是界面操作,所以选用vb)然后编译成dll用另一个vb程序测试,工作良好用vc做了一个类包装这个com,运行是,跟踪调试,发现
创建对象成功.调用和界面无关的函数成功,
与界面有关的如显示窗体的函数,一律返回 0x800a0196 错误
查一下错误信息,没查到我注销了这个dll,让vb***解释***运行这个com,
启动vc做的测试程序,显示窗体成功,一切正常.一句话,就是vb解释运行的时候,vc可以调用成功,vb编译成dll后,vb测试程序仍可以调用成功,但是vc测试程序不能显示窗体,返回0x800a0196 ,调用与窗体无关的函数,S_OK.注: 
vc测试程序中.
::CoInitialize(NULL);
::OleInitialize(NULL);
已经调用了,com和ole都初始化了.请各位大侠指教.

解决方案 »

  1.   

    idl:[
      uuid(19851206-D354-2005-AF10-7854687512AA),
      version(1.0)
    ]
    library OceanMediaLibLib
    {
    importlib("stdole2.tlb");    // Forward declare all types defined in this typelib
        interface IMediaLib;
    [
      odl,
          uuid(19851206-CDFA-4311-B398-5662D77BB322),
          version(1.0),
          dual,
          nonextensible,
          oleautomation
    ]
    interface IMediaLib: IDispatch {
    [id(0x60030001)]
    HRESULT GetNextOne([out,retval]BSTR* filename);
    [id(0x60030002)]
    HRESULT GetLoopNextOne([out,retval]BSTR* filename);
    [id(0x60030003)]
    HRESULT GetRndNextOne([out,retval]BSTR* filename);
    [id(0x60030004)]
    HRESULT GetPrevOne([out,retval]BSTR* filename);


    [id(0x60030005)]
    HRESULT Init([in]long mainHwnd,[out,retval]long* mlHwnd); [id(0x60030006)]
    HRESULT Show();
    [id(0x60030007)]
    HRESULT Hide(); [id(0x60030008)]
    HRESULT UserOpened([in]BSTR* filename);
    [id(0x60030009)]
    HRESULT UserAppend([in]BSTR* filename); [id(0x6003000A)]
    HRESULT SetFilter([in]BSTR* filter); };
    };这个idl只是声明接口,没有实现.
      

  2.   

    你有没有注册这个interface和type library?
    我想,问题可能是因为你没有注册interface或type library造成的。
      

  3.   

    注册了这个没有关系,tlb只是在vb,java中编程时,用到.在c中是不需要的,用midl生成的h,和 c就可以了.而且调用与界面无关的方法都成功,只有与界面有关的才会失败.所以注册与否无关.
      

  4.   

    你可能是使用了非模式对话框,而你的主程序不能支持非模式对话框。
    你试试看把非模式对话框改成模式的(vbModal),看看是不是可以用。可以参考一下这篇文章。
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;171978PS. tlb注册还和marshal有关,如果你用系统提供的proxy/stub功能的话。
      

  5.   

    还有这篇:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;247791
      

  6.   

    我在com中确实用了一个非模式的窗体
    但是模式的不符合要求,达不到设计的效果.com中不能用非模式对话框马?
    如何让主程序支持非模式对话框呢?
      

  7.   

    nelsonc(软件兔)  谢谢,
    看了那两篇文章我明白了.要能显示非模式的对话框,就必须让他参与消息循环.如果是模式的花,就不用了.在调用domodel的时候
    讲消息循环的控制权交给了对话框的消息循环.这样非模式的就可以用了,
    我那个问题,昨天解决了,我把它做成active exe就行了.我当时不知道为什么,现在明白了.谢谢