首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

对象指针为何不能够给另一个进程共享(wm_copydata机制)

2012-11-09 
对象指针为什么不能够给另一个进程共享(wm_copydata机制)WM_COPYDATA进入 C++ 世界,情况又更复杂些了。绝对

对象指针为什么不能够给另一个进程共享(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; // 指针
};

注意两者的差别
[解决办法]

探讨wm_copydata 底层到底是什么啊,

是把整个结构体的 发动系统的某个内存(叫全局的吧)

然后进程B拿到 这块内存的拷贝?

[解决办法]
指针是不能跨进程传递的
如果你想传递,那就只能传递完整的数据
然后到另一个进程用这些数据构造一个相同的对象
当然你对这个对象修改后还要原样的传回去
这样才能实现进程间同步

热点排行