对象指针为什么不能够给另一个进程共享(wm_copydata机制)
WM_COPYDATA
进入 C++ 世界,情况又更复杂些了。绝对不可以把“指向某一拥有虚函
数的对象”的指针当做 lpData 来传递。因为 vtbl(译注:virtual table,因虚
函数而形成)指针将因此错误地指向别的进程中的函数。这样的限制也就排除
了对“运行时类型检验(runtime type checking)”的使用,因为运行时的类型
检验需仰赖虚函数。下面这个例子中,析构函数被声明为虚函数,所以将会拥
有一个 vtbl 指针。指向此 BadDataClass 对象之指针若被用做 lpData,vtbl 指
针将不正确地指向另一个进程。
class BadDataClass
{
public:
BadDataClass();
virtual ~BadDataClass();
};
以上摘录win32多线程
这样的限制也就排除
了对“运行时类型检验(runtime type checking)”的使用,因为运行时的类型
检验需仰赖虚函数。
什么意思?
进程A有个对象,然后通过sendmessage发指针给进程B ,虚函数表自然会被这个指针访问到。 有什么不对?
[解决办法]
你觉得一个指针在自身的地址空间是有效的,你能指望它在其它进程的地址空间中还有效吗?
[解决办法]
先抛开虚函数什么的
进程有各自的地址空间,好比有各自的房间
你的房间的某个室某面墙的某个角落里放着一本书
别人的房间的某个室某面墙的某个角落里放着什么你未必知道
你现在却把“某个室某面墙的某个角落”这个地址传递过去,指望一定能找到一本书?
[解决办法]
struct GoodDataBlock
{
DWORD dwNumber;
char szBuffer[80]; // 数组
};
struct GoodDataBlock
{
DWORD dwNumber;
char *szBuffer; // 指针
};
注意两者的差别
[解决办法]