我建了一个COM,并实现了IDispatch,不过没有实现类型库,但能被VC调用IDispatch调用,可是不能被VB调,
VB调用代码如下是失败的:
Dim objMath As Object
        objMath = CreateObject("goodCom.IX.2")
        objMath.Fx()
VC代调用码成功如下:
::CLSIDFromProgID(L"InsideCOM.Chap07.1aaaaaaaaaa",&clsid);
if(FAILED(CoInitialize(NULL)))
{
trace("Unable to initialize COM");
return -1;
}
IUnknown* pUnk;
pUnk=NULL;
HRESULT hr=CoCreateInstance(clsid,
NULL,
CLSCTX_SERVER,
IID_IUnknown,
(void* * )&pUnk);

if(FAILED(hr))
{
trace("Failed to create Server instance .");
CoUninitialize();
}
IDispatch* pDispatch;
hr=pUnk->QueryInterface(IID_IDispatch,(void** )&pDispatch);
pUnk->Release();
if(FAILED(hr))
{
trace("Failed to create server instance ");
CoUninitialize();
return -1;
}
LPOLESTR lpOleStr=L"Fx";
DISPID dispid;
hr=pDispatch->GetIDsOfNames(IID_NULL,&lpOleStr,1,LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr))
{
trace("GetIDsOfNames failed.HR");
}
VARIANTARG vaResult;
hr=pDispatch->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,NULL,&vaResult,0,NULL);
有有谁知道,要被VB调用要实现什么东东啊!!!!还有怎么用MIDL,我建了IDL怎么用MIDL执行它啊,我用midl Myidl.idl命令失败,没有生成类型库晕倒

解决方案 »

  1.   

    VB工程中添加DLL COM生成的tlb类型库文件!
      

  2.   

    不要使用CreateObject(),直接引用组件,用new关键字创建对象.
      

  3.   

    写错了因该是objMath = CreateObject("InsideCOM.Chap07.1aaaaaaaaaa"),我除去了 objMath.Fx()还是有错。我跟踪了一下创是创建了调用了组件的CoCreateInstance,可是最后又调了Release()不知是为什么
    TO firmbird(firmbird)你写出具体代码来看看
    TO vcleaner(我没当大哥很久了.......) 一定要类型库文件吗 ?
      

  4.   

    VB工程直接在引用中添加dll文件。
    然后,直接可以New出来组件。
      

  5.   

    《深入解析ATL》书中有介绍如何使ATL编写的COM在VB中可以调用。
      

  6.   

    vb调用com有两种方式,你这种方式是后绑定,是用PROGID来CreataInstance的;另一种方式就是引用,是前绑定,跟vc使用.h一样的道理,这种可以直接new。
      

  7.   

    我的email ffoieoi @163.com