如何通过PostMessage传递两个变量,类型均为CString ::PostMessage(m_hWndEmployee,ADDEMPLOYEE,……);请问怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CString str1, str2;::PostMessage(m_hWndEmployee,ADDEMPLOYEE,&str1, &str2); CString str1, str2;str1="sadfasfsafsad";str2="sadfsadf";::PostMessage(m_hWndEmployee,ADDEMPLOYEE,str1.GetBufffer(str1.GetLength()), &str2.GetBuffer(str2.GetLength())); 楼上说的不行。应该这样来处理:如果是同一个进程内PostMessage,那么可以:WPARAM wParam = (WPARAM) new TCHAR[str1.GetLength()+1];LPARAM lParam = (LPARAM) new TCHAR[str2.GetLength()+1];lstrcpy( (TCHAR*)wParam, str1 );lstrcpy( (TCHAR*)lParam, str2 ); ::PostMessage(m_hWndEmployee,ADDEMPLOYEE, wParam, lParam );而ADDEMPLOYEE消息的处理里进行delete这两个指针。如果是不同进程PostMessage,可以:WPARAM wParam = (WPARAM) GlobalAddAtom( str1 );LPARAM lParam = (LPARAM) GlobalAddAtom( str2 );而ADDEMPLOYEE消息的处理里,调用GlobalDeleteAtom销毁这两个Atom 直接PostMessage,除非str1和str2是全局变量才行,否则如果str1和str2是局部变量,那是要出问题的。 那在处理函数中怎么再将它接收转换成CString类型的变量呢?LRESULT CEmployee::OnAddEmployee(WPARAM wParam, LPARAM lParam){ CString revname; CString revdepartment;//分别接收str1,str2 ……} 第一种情形的消息处理:同一个进程中,为了PostMessage字符串,就是在堆里通过new或者malloc分配一个新的字符串空间,然后把要Post的字符串拷贝进去,然后将这个字符串的地址Post过去,消息接收处理方只要强制转换为字符串就行了,即: TCHAR* szStr1 = (TCHAR*)wParam; CString revname = szStr1; delete [] szStr1; //不要忘了最后delete这个分配的内存区。第二种情形,不同进程间可以通过一种叫全局原子(Atom)的东东来传递字符串。原子就是专门为某个字符串在系统里找到一个相应的整数来和之关联,这个整数由系统分配。这样你可以通过字符串找到整数,也可以通过整数来找到字符串。原子分为局部原子,用于本进程内;全局原子用于不同进程。 ATOM am1 = GlobalAddAtom( str1 ); //就是让系统为str1分配一个整数原子之后你随时可以通过am1来找到相应的字符串是什么: TCHAR szStr1[512]; UINT nStr1Len = GlobalGetAtomName( am1, szStr1, 512 ); if( nStr1Len > 0 ) //说明成功 { CString revname = szStr1; } 最后用GlobalDeleteAtom删除创建的原子 求MFC大神指点关于edit控件光标问题 如何使用CreateWindow创建的Button可以使用Xp视觉效果? 怎么在win32 app中用SetTimer? 压上家产,再开一贴,高手来看 如何给程序添加标题,在线等待中。各位帮忙啊! 十万火急,我已经将.cpp和.h文件给删除了,怎么还会出现这样的错误呢?? 关于静态函数的问题 再请教:函数“GetEventLogInformation”Include在哪个文件中? 回调函数 在DLL中如何取得自己的路径? 请问DX9.0aSDK与DX9.0bSDK有什么区别? 高分求购ADO连接局域网内Access数据库的代码,分不够可以再加!!!
str1="sadfasfsafsad";
str2="sadfsadf";
::PostMessage(m_hWndEmployee,ADDEMPLOYEE,str1.GetBufffer(str1.GetLength()), &str2.GetBuffer(str2.GetLength()));
如果是同一个进程内PostMessage,那么可以:
WPARAM wParam = (WPARAM) new TCHAR[str1.GetLength()+1];
LPARAM lParam = (LPARAM) new TCHAR[str2.GetLength()+1];
lstrcpy( (TCHAR*)wParam, str1 );
lstrcpy( (TCHAR*)lParam, str2 );
::PostMessage(m_hWndEmployee,ADDEMPLOYEE, wParam, lParam );而ADDEMPLOYEE消息的处理里进行delete这两个指针。如果是不同进程PostMessage,可以:
WPARAM wParam = (WPARAM) GlobalAddAtom( str1 );
LPARAM lParam = (LPARAM) GlobalAddAtom( str2 );而ADDEMPLOYEE消息的处理里,调用GlobalDeleteAtom销毁这两个Atom
那是要出问题的。
LRESULT CEmployee::OnAddEmployee(WPARAM wParam, LPARAM lParam)
{
CString revname;
CString revdepartment;//分别接收str1,str2
……
}
同一个进程中,为了PostMessage字符串,就是在堆里通过new或者malloc分配一个新的字符串空间,然后把要Post的字符串拷贝进去,然后将这个字符串的地址Post过去,消息接收处理方只要强制转换为字符串就行了,即:
TCHAR* szStr1 = (TCHAR*)wParam;
CString revname = szStr1;
delete [] szStr1; //不要忘了最后delete这个分配的内存区。第二种情形,不同进程间可以通过一种叫全局原子(Atom)的东东来传递字符串。原子就是专门为某个字符串在系统里找到一个相应的整数来和之关联,这个整数由系统分配。这样你可以通过字符串找到整数,也可以通过整数来找到字符串。原子分为局部原子,用于本进程内;全局原子用于不同进程。
ATOM am1 = GlobalAddAtom( str1 ); //就是让系统为str1分配一个整数原子
之后你随时可以通过am1来找到相应的字符串是什么:
UINT nStr1Len = GlobalGetAtomName( am1, szStr1, 512 );
if( nStr1Len > 0 ) //说明成功
{
CString revname = szStr1;
}