首先说一下环境
OS:winXP SP2
IDE:VC++2005 SP1
WTL8.0
dialog程序 里面加了三个 用MFC写的ActiveX控件(已经注册),然后 import路径 定义接口变量...
代码:
以一个控件为例
CAxWindow m_wndVocx;
CComPtr<_DVocx> m_vocx;
.....
m_wndAocx = GetDlgItem(IDC_AOCXCTRL);//绑定ID
//下面是得到_DVocx接口
HRESULT hr = m_wndVocx.QueryControl(&m_vocx);
ATLASSERT(hr == S_OK);
//m_vocx得到了值
但是发现 编译后的 vocx.tlh文件中
一个方法也没有struct __declspec(uuid("9a6104af-0e26-4a90-961f-3c6d2fb3a569"))
_DVocx : IDispatch
{//空的};为什么会这样 不解中!!!!
请高手指点 是要自己添加吗?不应该啊 
我插入一个flash控件的时候 他的tlh文件里面的方法都有啊
郁闷中

解决方案 »

  1.   

    哈哈,我也说到过类似的。以前的一个工程 import 无问题,到vs2005,就不行了。最后 CoCreateInstance 搞定的,你参考一下,不一定能解决你的问题。
      

  2.   

    你的activeX的控件的type lib到底在不在呢?vc找到了才能产生tlh。另:这个和WTL好像没什么关系。
      

  3.   

    如果没有 lib 怎么生成lib?
      

  4.   

    正常情况下,每个activeX工程会有个纯文本的odl文件,vc会帮你把该odl文件编译成.tlb文件,一般.tlb文件会被编译进exe文件的资源内,当然也可以单独成文件。关键是tlb文件也要被注册,这样系统才能找到activeX对应的typelib。别人在用你的activeX的时候需要根据tlb来生成c++语言可用的头文件,也就是tlh文件。
      

  5.   

    按照 楼上的说法 用 ActiveX控件测试容器 测试了 方法都有啊
    这个又是怎么回事呢?
      

  6.   

    这个控件是人家给的 不是我自己写的!所以没有IDL文件
      

  7.   

    用OleView来检查一下这个控件,看看接口方法是否齐全。如果有问题,重新注册一次控件试试。
      

  8.   

    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: aocx.ocx[
      uuid(AD5FE9A2-4D42-4DBB-A9EA-4D7AAFA112BD),
      version(1.0),
      helpstring("aocx ActiveX Control module"),
      helpfile("aocx.hlp"),
      helpcontext(00000000),
      custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 83951780),
      custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1197075952)]
    library AOCXLib
    {
        // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("stdole2.tlb");    // Forward declare all types defined in this typelib
        dispinterface _DAocx;
        dispinterface _DAocxEvents;    [
          uuid(94561183-AD27-4373-BC0B-2177A89D7955),
          helpstring("Dispatch interface for Aocx Control"),
          hidden
        ]
        dispinterface _DAocx {
            properties:
                [id(0x00000001)            
    ]
                VARIANT_BOOL IsOpen;
                [id(0x00000002)            
    ]
                long nMyPort;
                [id(0x00000003)            
    ]
                long nGroupID;
                [id(0x00000004)            
    ]
                long nMyUIN;
            methods:
                [id(0x00000005)]
                long initialize();
                [id(0x00000006)]
                long SetRCode(
                                long ComType, 
                                long MPackSize, 
                                long EchoVal, 
                                long G723);
                [id(0x00000007)]
                long SetTCode(
                                long ComType, 
                                long MPackSize, 
                                long PreVal, 
                                long SilenSup, 
                                long MaxFrames, 
                                long G723);
                [id(0x00000008)]
                long SetDest(
                                BSTR sDestIP, 
                                long nPort);
                [id(0x00000009)]
                long SetRPort(long nPort);
                [id(0x0000000a)]
                long SetLoginNATSvr2(
                                long myUIN, 
                                long DestUIN, 
                                long myPort, 
                                long DestPort, 
                                BSTR sServerIP, 
                                long nSrvPort);
                [id(0x0000000b)]
                long SetMVolume(
                                long dID, 
                                long vol);
                [id(0x0000000c)]
                long SetNetwork(
                                BSTR sIP, 
                                long nPort, 
                                BSTR sProxyIP, 
                                long nProxyPort, 
                                BSTR sUserName, 
                                BSTR sPass);
                [id(0x0000000d)]
                long SetSVol(
                                long dID, 
                                long vol);
                [id(0x0000000e)]
                long StartRecv(long waveoutDID);
                [id(0x0000000f)]
                long StartTran(long waveinID);
                [id(0x00000010)]
                long StopRran();
                [id(0x00000011)]
                long StopRecv();
                [id(0x00000012)]
                long Destroy();
                [id(0x00000013)]
                long GetErrorCode(long val);
                [id(0x00000014)]
                long MCURegPort(long nPort);
                [id(0x00000015)]
                long MCUSendAudio();
                [id(0x00000016)]
                long MCUSetNetwork(
                                BSTR sSvrIP, 
                                long nPort);
                [id(0x00000017)]
                VARIANT_BOOL MicrophoneAvailable();
                [id(0x00000018)]
                VARIANT_BOOL SpeakerAvailable();
                [id(0x00000019)]
                long MCUPause(VARIANT_BOOL bStop);
                [id(0x0000001a)]
                long PCMDataDestination(
                                BSTR sIP, 
                                long nPort);
                [id(0xfffffdd8)]
                void AboutBox();
        };    [
          uuid(DF6D9735-7F9C-4FFE-AB7E-DD57B2CAA841),
          helpstring("Event interface for Aocx Control")
        ]
        dispinterface _DAocxEvents {
            properties:
            methods:
                [id(0x00000001)]
                void OnErrCode(
                                long nCode, 
                                BSTR sMsg);
                [id(0x00000002)]
                void OnConnect(VARIANT_BOOL bConn);
        };    [
          uuid(EC7B8046-67CD-4B5B-B56E-2BF6BF56D215),
          helpstring("Aocx Control"),
          control
        ]
        coclass Aocx {
            [default] dispinterface _DAocx;
            [default, source] dispinterface _DAocxEvents;
        };
    };
      

  9.   

    看出问题了,人家_DAocx接口是隐藏的(看看属性里面的hidden),import时不会生成属性和接口。你可以建一个一样的接口,然后仿照import后生成的文件手工做一个文件,把名字改成_DAocx即可。隐藏属性仅仅无法看到内容,但是内容都是可以用的