如题目所示,我用evc++编写的exe如何调用evc++编写的COM组件?

解决方案 »

  1.   

    ldsjlzy(小李),我用VC++中的方法,好像不行。
    我以前在VC++中使用#import把COM的.tlb包进来就可以了。
    但是现在用#import不行了,我把COM接口类的.h文件包进来,
    再把atlbase.h文件也包进来,使用CComPtr类模板定义一个模板类,
    但是调用.CoCreateInstance函数创建实例不成功,请问是什么原因呀?
      

  2.   

    不能用智能指针,用它的API创建
      

  3.   

    ldsjlzy(小李)大哥,COM组件的API是什么?是方法吗?应该不是的。
    我有一个接口叫ITestComDrv,我使用下面的代码创建接口对象。CComPtr<ITestCOMDrv> m_pTestComDrv;
    HRESULT hr = m_pTestComDrv.CoCreateInstance( __uuidof(ITestCOMDrv) );
    if ( FAILED(hr) )
    {
    ::MessageBox(NULL, _T("Create instance fail."), NULL, MB_YESNOCANCEL | MB_ICONWARNING);
    return FALSE;
    }创建的结果是不成功,请问正确的写法应该是什么样子的?
    请帮帮小弟,谢谢!!
      

  4.   

    HRESULT hr = ::CoInitialize(0);ITestCOMDrv* pTestComDrv=NULL;
    hr = ::CoCreateInstance(CLSID_TestCOMDrv,
    NULL,
    CLSCTX_ALL,
    IID_ITestCOMDrv,
    (void **)&pTestComDrv);试试,另外你返回的错误码是什么啊
      

  5.   

    ldsjlzy(小李)大哥,我使用你给的方法,但是编译部通过,显示信息如下,好像连接时无法识别
    CLSID和IID,是不是还要包一些文件?--------------------Configuration: TestCOMRPC - Win32 (WCE emulator) Debug--------------------
    Compiling...
    TestCOMRPC.cpp
    TestCOMRPCDlg.cpp
    Generating Code...
    Linking...
    TestCOMRPCDlg.obj : error LNK2001: unresolved external symbol _CLSID_TestCOMDrv
    TestCOMRPCDlg.obj : error LNK2001: unresolved external symbol _IID_ITestCOMDrv
    emulatorDbg/TestCOMRPC.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.TestCOMRPC.exe - 3 error(s), 0 warning(s)
      

  6.   

    可以用__uuidof代替IID或CLSID
    __uuidof(ITestCOMDrv) 等于 IID_ITestCOMDrv
    __uuidof(TestCOMDrv) 等于 CLSID_TestCOMDrv
      

  7.   

    HRESULT hr = ::CoCreateInstance(
    __uuidof(TestCOMDrv),
    m_pIUnK,
    CLSCTX_INPROC_SERVER,
    __uuidof(ITestCOMDrv),
    (LPVOID *)&m_pIUnK);
    if ( FAILED(hr) ) return FALSE;hr = m_pIUnK->QueryInterface(
    __uuidof(ITestCOMDrv),
    (LPVOID *)&m_pITestComDrv);
    if ( FAILED(hr) ) return FALSEldsjlzy(小李)大哥,我使用__uuidof之后,编译OK了,运行的时候,CoCreateInstance成功了,但是下面的QueryInterface调用返回失败,是什么原因?是不是我的ITestComDrv接口没有注册呀?
      

  8.   

    ldsjlzy(小李)大哥,刚才我说错了,是第一步CoCreateInstance返回的就是失败的,这是不是因为没有注册?
      

  9.   

    ldsjlzy(小李)大哥,CoCreateInstance失败,返回值是CO_E_NOTINITIALIZED,好像是没初始化的意思,我应该怎么办?
      

  10.   

    没加这句吗?
    HRESULT hr = ::CoInitialize(0);
      

  11.   

    另外组件是要注册的,regsvr32 your.dll
      

  12.   

    我这个COM是用evc++写的,要用在wince上面的,在wince上面如何注册?
    而且wince是不支持::CoInitialize(0);的。
      

  13.   

    对,wince不支持CoInitialize,改成CoInitializeEx(0, COINIT_MULTITHREADED);
    对wince不同设备厂商可能对com的支持不一样.(虽都是ms的库)
    注册的话用ce下的跟pc不一样,用DllRegisterServer注册吧
    还要看你的设备是不是支持该函数,把机器上的ole32.dll拷到pc上,
    命令行敲入link /dump /exports ole32.dll列出看是否支持你所用的API
      

  14.   

    OK了,谢谢ldsjlzy(小李)兄弟,你能留个QQ或者MSN吗,有问题再请教你呀!!