一个关于COM接口和普通struct类型的类型转换问题

freezingfire 2008-02-15 04:04:29
首先看一个简单程序,这个程序编译能够通过,链接不能通过

struct A
{
int Send();
};

class B
{
public:
int Send() { cout < <"This is B::Send()!" < <endl; };
};

int main(void)
{
B *pB = new B;

A *pA = reinterpret_cast <A*> (pB);
pA-> Send();

delete pB;
return 0;
}

VC会报告:
error LNK2019: unresolved external symbol "public: int __thiscall A::Send(void)" (?Send@A@@QAEHPAH@Z) referenced in function _main

但是,如果将struct A定义为一个接口IA,创建一个ATL工程,比如名为ConnectionTest,定义接口IA,IDL文件如下所示:

library ConnectionTestLib
{
importlib("stdole2.tlb");

[
object,
uuid(21D953A8-1314-425A-943A-ABFD7D849948),
helpstring("IA Interface"),
pointer_default(unique)
]
interface IA : IUnknown{
[helpstring("method Send")] HRESULT Send(void);
};
// 此处我删除了coclass因为不需要
};

编译这个ATL工程,然后修改main函数如下:

#include <iostream>

#define STD_IMPORT_OPTIONS raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "ConnectionTest.tlb" STD_IMPORT_OPTIONS

using namespace std;

class B
{
public:
int Send() { cout < <"This is B::Send()!" < <endl; };
};

int main(void)
{
B *pB = new B;

IA *pIOC = reinterpret_cast <IA*> (pB);
pIOC-> Send();

delete pB;
return 0;
}

这个程序当然无法运行,但是,它能通过编译和链接,build成功。

我觉得这是件很奇怪的事。struct A和interface IA有什么区别?为什么编译器会区别对待?

同样是类型转换之后的函数调用,为什么会一个成功,一个失败?

多谢了。
...全文
96 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfwsm 2008-02-16
  • 打赏
  • 举报
回复
mark
baihacker 2008-02-15
  • 打赏
  • 举报
回复
记录一下
我啃 2008-02-15
  • 打赏
  • 举报
回复
纯虚基类,定义了接口的特性,继承自其的子类实现该接口函数就可以使用了~
详细见primer介绍的多态性,或者其他入门书籍
我啃 2008-02-15
  • 打赏
  • 举报
回复
struct       A   
{
virtual int Send() = 0;
};

class B : public A
{
public:
int Send() { cout < <"This is B::Send()!" < <endl; };
};

int main(void)
{
B *pB = new B;

A *pA = reinterpret_cast <A*> (pB);
pA-> Send();

delete pB;
return 0;
}

就好了!
我啃 2008-02-15
  • 打赏
  • 举报
回复
interface IA
是COM的接口,只要TYPELIB信息完全就可以了
C++里面定义一个类如果要使用函数必须实现,不可以使用猜测式强制转换企图让两个不相干的类A,B A works like a B

如果要实现这个,必须使用动态多态即虚函数

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧