描述:
#include <unknwn.h>
class MyObject:public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef(void);
virtual ULONG STDMETHODCALLTYPE Release(void);
MyObject();
~MyObject();
ULONG m_Count;
};
GUID LIBID_Server = {0x8F4CFFB4, 0xF45C, 0x4FFD,{ 0xB5, 0x16, 0x65,0xD5, 0x3E, 0xF2,0xB7, 0xB7} };
MyObject::MyObject()
{
m_Count=0;
}
MyObject::~MyObject()
{
//Release();
}
HRESULT STDMETHODCALLTYPE MyObject::QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
IUnknown* pI;
*ppvObject=static_cast<MyObject *>(this);
pI=this;
pI->AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE MyObject::AddRef(void)
{
return 2;
}
ULONG STDMETHODCALLTYPE MyObject::Release(void)
{
return 1;
}
ULONG __stdcall Thread(void *)
{
DWORD dwRegister;
MyObject my;
CoInitialize(NULL);
HRESULT hr=CoRegisterClassObject(LIBID_Server,
static_cast<IUnknown *>(&my),
CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE,
&dwRegister);
if(SUCCEEDED(hr))
{//显示
MessageBox(...);
}
else {CoUninitialize();return 0;}
MSG msg ;
while (::GetMessage(&msg, 0, 0, 0))
{
::DispatchMessage(&msg) ;
}
CoUninitialize();
MessageBox(...)
return 0;
}
上面的代码中,线程执行的时候
CoInitialize->CoRegisterClassObject->MyOjbect::AddRef->CoUninitialize->MyOjbect::QueryInterface->MyOjbect::AddRef
然后报pure virtual function called纯虚函数调用,怎么回事?我的代码有错吗?
请各位高手指点,最好提供最简单的COM例子。
解决方案1:
VC6 -> 新建 ATL COM 工程 -> 缺省选项 FINISH -> Insert -> ATL 对象 -> Simple Object -> 缺省选项 FINISH -> 右键点接口 -> add method -> 输入方法名 -> OK
就会生成一个最简单的COM
推荐阁下去个网站:www.codeproject.com
或者www.codeguru.com(都是国外的)
上面有专门讲述COM/COM+及ATL编写COM的专题,非常经典的网站,相信你会喜欢!
http://www.john.findlay1.btinternet.co.uk/OLE/comlib.zip
是用c语言 写的com ,更简单啊
用lcc编译
楼主啊,难道我网站上的那个com例子还不简单,是不是要我给你写一个只显示一个字符串的com阿
解决方案5: 我的网站上有你需要的技术资料
vc开发者 http://dever.6to23.com
在vs7下简直不用写,不过我没有用属性化
解决方案7: 去vckbase找一个
csdn上也应该有的,耐心找
#include <iostream.h>
#include <objbase.h>
void trace(const char* pMsg)
{
cout << pMsg << endl;
}
//Abstract interfaces
interface IX
{
virtual void __stdcall Fx1() = 0;
virtual void __stdcall Fx2() = 0;
};
interface IY
{
virtual void __stdcall Fy1() = 0;
virtual void __stdcall Fy2() = 0;
};
//Interface implementation
class CA : public IX, public IY
{
public:
//Implement interface IX.
virtual void __stdcall Fx1()
{
cout << "CA::Fx1" << endl;
}
virtual void __stdcall Fx2()
{
cout << "CA::Fx2" << endl;
}
//Implement interface IY.
virtual void __stdcall Fy1()
{
cout << "CA::Fy1" << endl;
}
virtual void __stdcall Fy2()
{
cout << "CA::Fy2" << endl;
}
};
//Client
int main()
{
trace("Client: Create an instance of the component.");
CA* pA = new CA;
//Get an IX pointer.
IX* pIX = pA;
trace("Client: Use the IX interface.");
pIX->Fx1();
pIX->Fx2();
//Get an IY pointer
IY* pIY = pA;
trace("Client: Use the IY interface.");
pIY->Fy1();
pIY->Fy2();
trace("Client: Delete the comonent.");
delete pA;
return 0;
}

