描述:
新建的win 32 DLL,里头就一个 Add 函数
其他就是接口的实现以及
DllGetClassObject
DllCanUnloadNow
DllRegisterServer
DllUnregisterServer
等四个函数的实现。
通过vc创建的工程(代码如下)能调用,但在 vb 中却无法找到该 COM 对象。是不是还需要实现什么呢?
多谢!
#include <Windows.h>
#include <stdio.h>
#include <initguid.h>
// {64CA0230-BF36-4ec4-836A-45B5FB69CD7A}
DEFINE_GUID(IID_IMath,
0x64ca0230, 0xbf36, 0x4ec4, 0x83, 0x6a, 0x45, 0xb5, 0xfb, 0x69, 0xcd, 0x7a);
class IMath : public IUnknown
{
public:
STDMETHOD(Add)(long, long, long*) PURE;
//STDMETHOD(Subtract)(long, long, long*) PURE;
//STDMETHOD(Multiply)(long, long, long*) PURE:
//STDMETHOD(Divide)(long, long, long*) PURE;
};
int main(int argc, char* argv[])
{
CLSID clsid;
IClassFactory * pCF;
CoInitialize(NULL);
/*
-2147221008 转成16进制是0x800401f0
这是一个系统错误,用Error Lookup察看显示: 尚未调用 CoInitialize。
解决的办法是在初始化时调用CoInitialize。
*/
HRESULT hr = CLSIDFromProgID(L"Test1.Math.1", &clsid);
if(FAILED(hr))
{
printf("1\n");
return -1;
}
hr = CoGetClassObject(clsid, CLSCTX_INPROC, NULL, IID_IClassFactory, (void**)&pCF);
if(FAILED(hr))
{
printf("%d\n", hr);
printf("2\n");
return -1;
}
IUnknown* pUnk;
hr = pCF->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
if(FAILED(hr))
{
printf("3\n");
return -1;
}
pCF->Release();
IMath* pMath = NULL;
hr = pUnk->QueryInterface(IID_IMath, (void**)&pMath);
if(FAILED(hr))
{
printf("4\n");
return -1;
}
pUnk->Release();
long result;
pMath->Add(100, 8, &result);
printf("%d\n", result);
pMath->Release();
return 0;
}
解决方案1:
在vb添加控件中找到你自己注册的控件,选择添加就可以添加到你的工程,在按你上面的办法试一下。
解决方案2: http://www.vckbase.com/document/viewdoc/?id=1501
建议好好看一下,这一系列的文章.你是个MM吧?? 呵呵~~~~~~~
你的DLL库有注册么?编译完成后,执行一下:Tools=>Register Control.
然后在OleView中查看,Just try.
在vb环境中, 点菜单project->References, 在出现的窗口中, 选择你自己的组件.
解决方案5:在vb中调用需要从idispatch继承的双接口才行吧。