在《COM技术内幕》中的例子,运行发生错误error C2259: 'CA' : cannot instantiate abstract class due to following members: 是按书上做的啊
贴出部分代码:
#include "stdafx.h"
#include <iostream>
#include "objbase.h"
#include "Iface.h" //包含IX的定义interface IX:IUnknown{ virtual ULONG __stdcall FX()=0;};
using namespace std;
void trace(const char* msg){cout<<"Componcnt:"<<msg<<endl;}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
class CA:public IX{
public:
virtual HRESULT __stdcall QueryInterface(const IID* iid,void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void __stdcall FX();
public:
CA():m_cRef(0){}
~CA(){trace("Destroy Self");}
private:
LONG m_cRef;
};
HRESULT __stdcall CA::QueryInterface(const IID* iid,void** ppv)
{
if(*iid==IID_IUnknown){
trace("Return pointer to IUnknown");
*ppv=static_cast<IX*>(this);
}
else if(*iid==IID_IX)
{
trace("Return pointer to IX");
*ppv=static_cast<IX*>(this);
}
else
{
trace("Interface not supported");
*ppv=NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG __stdcall CA::AddRef()
{
return m_cRef++;
}
ULONG __stdcall CA::Release()
{
if(--m_cRef==0)
{
delete this;
return 0;
}
return m_cRef;
}
void __stdcall CA::FX(){cout<<"FX"<<endl;}
extern "C" _declspec(dllexport) IUnknown* CreateInstance()
{
IUnknown* PI=static_cast<IX*>(new CA); //在这里error C2259
PI->AddRef();
return PI;
}
贴出部分代码:
#include "stdafx.h"
#include <iostream>
#include "objbase.h"
#include "Iface.h" //包含IX的定义interface IX:IUnknown{ virtual ULONG __stdcall FX()=0;};
using namespace std;
void trace(const char* msg){cout<<"Componcnt:"<<msg<<endl;}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
class CA:public IX{
public:
virtual HRESULT __stdcall QueryInterface(const IID* iid,void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void __stdcall FX();
public:
CA():m_cRef(0){}
~CA(){trace("Destroy Self");}
private:
LONG m_cRef;
};
HRESULT __stdcall CA::QueryInterface(const IID* iid,void** ppv)
{
if(*iid==IID_IUnknown){
trace("Return pointer to IUnknown");
*ppv=static_cast<IX*>(this);
}
else if(*iid==IID_IX)
{
trace("Return pointer to IX");
*ppv=static_cast<IX*>(this);
}
else
{
trace("Interface not supported");
*ppv=NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG __stdcall CA::AddRef()
{
return m_cRef++;
}
ULONG __stdcall CA::Release()
{
if(--m_cRef==0)
{
delete this;
return 0;
}
return m_cRef;
}
void __stdcall CA::FX(){cout<<"FX"<<endl;}
extern "C" _declspec(dllexport) IUnknown* CreateInstance()
{
IUnknown* PI=static_cast<IX*>(new CA); //在这里error C2259
PI->AddRef();
return PI;
}
解决方案 »
- 关于VPN客户端无法在win7系统使用的问题!
- (全分)还是字符串输出问题
- Win32 API 怎样访问远程html(www.csdn.com/index.html)
- 有棋牌类游戏的兼职或外包,请联系我。
- 大家帮忙解释一下关于QueryInterface (IID_IDispatch, (void **) &pDisp),谢谢.
- 挑战高分:winsock编程的一个小问题
- 请问在MFC中如何手动发送消息?
- 又一个菜问题
- 既然CALLBACK WINAPI最终变成_stdcall windows为什么还要产生诸如APIENTERY等这么多一样的参数类型。
- error LNK2001: 无法解析的外部符号 __imp__HJCalcDisCEx \fatal error LNK1120: 1 个无法解析的外部命令
- 推荐几本网络编程由浅入深的书籍?
- 用SHGetFileInfo获得的ICON保存成PNG有黑边的问题
HRESULT QueryInterface(
REFIID iid, //<<<<注意这里
void ** ppvObject
);你定义的函数不是基类所需要的,因此你不是实现了基类的纯虚函数,而是隐藏了基类的纯虚函数