首页
社区
课程
招聘
怪异的VC编译问题,请指点一下。
发表于: 2011-1-21 23:20 4390

怪异的VC编译问题,请指点一下。

2011-1-21 23:20
4390
各位前辈,最近在看 Detour Hook COM interface 的代码,在例程里面有以下代码

//////////////////////////////////////////////////////////////////////////////
//
//  WARNING:
//
//  CINTERFACE must be defined so that the lpVtbl pointer is visible
//  on COM interfaces.  However, once we've defined it, we must use
//  coding conventions when accessing interface members, for example:
//      i->lpVtbl->Write
//  instead of the C++ syntax:
//      i->Write.
//  We must also pass the implicit "this" parameter explicitly:
//      i->lpVtbl->Write(i, pb, 0, NULL)
//  instead of the C++ syntax:
//      i->Write(pb, 0, NULL)
//
#define CINTERFACE
#include <ole2.h>
#include <Objbase.h>
#include <windows.h>
#include <detours.h>

//////////////////////////////////////////////////////////////////////////////

上面的注释提到了CINTERFACE 可以使用lpVtbl 。

小弟依葫芦画瓢,创建了一个DLL工程(非MFC),
pStream->lpVtbl->SetSize(pStream, ul);
这句总是编译不过,提示
s2005dll.cpp(58) : error C2039: “lpVtbl”: 不是“IStream”的成员
1>        D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(4444) : 参见“IStream”的声明

为何lpVtbl无法用呢?很是苦恼,要怎么样才行?谢谢指点。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2

...
// i->lpVtbl->Write
// instead of the C++ syntax:
// i->Write.
...

意思是在C模式下 i->lpVtbl->Write,与C++模式下 i->Write是等效的。
而你的错误是

s2005dll.cpp(58) : error C2039: “lpVtbl”: 不是“IStream”的成员

显然你是C++工程,因此你不能用lpVtbl,也不需要。
COM接口定义了两套,一套是给C代码用的,一套是给C++用的,通过条件编译切换。C++会自动生成虚函数表(而且虚函数表不可以显式访问),而C不会,因此在C模式下需要定义虚函数表lpVtbl。
2011-1-21 23:44
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你的是什么东西
2011-1-22 01:37
0
游客
登录 | 注册 方可回帖
返回
//