急为啥PostMessage发送结构体会乱码
急,,,为什么PostMessage发送结构体会乱码
如上,PostMessage给其他程序发送结构体接收到的数据会乱码,SendMessage的WM_COPYDATA不考虑,效率偏低,也不考虑共享内存的方法,只想通过PostMessage给其他程序发送结构体。请问各位有什么解决方法呢?
------最佳解决方案--------------------
而且不同进程之间最好用共享内存.
------其他解决方案--------------------
PostMessage(FindWindow(NULL,"Receive"),WM_SEND,0,(LPARAM)stu);
把&去掉
------其他解决方案--------------------
FILE_MAP_WRITE,0,0,0);
if(pv!=NULL){
memcpy(pv,ss.str().c_str(),sz);
memset((char*)pv+sz,0,256-sz);
UnmapViewOfFile(pv);
}
//send to target process
DWORD idProcess;
GetWindowThreadProcessId(hwnd,&idProcess);
HANDLE hProcess= OpenProcess(PROCESS_DUP_HANDLE,FALSE,idProcess);
HANDLE hDup=0;
DuplicateHandle(GetCurrentProcess(),hFile,hProcess,&hDup,NULL,FALSE,DUPLICATE_SAME_ACCESS);
PostMessage(hwnd,WM_MSG_SEND,0,(LPARAM)hDup);
CloseHandle(hFile);
/*
if(pStream->Write(ss.str().c_str(),ss.str().size(),NULL)!=S_OK){
cout<<"stream write fail"<<endl;
}
HGLOBAL hgb=NULL;
//PostMessage(hwnd,WM_MSG_SEND,0,(LPARAM)hgb);
GetHGlobalFromStream(pStream,&hgb);
pStream->Release();
ULONG sz=GlobalSize(hgb);
*/
cout<<"item posted, bytes ="<<sz<<endl<<endl;
CoUninitialize();
}else{
break;
}
} while (1);
return 0;
}
接收端:
//结构体
struct Student
{
char Name[10];
int age;
};
//发送端@bcb工程
Student *stu =new Student;
strcpy(stu->Name,"date");
stu->age = 18;
PostMessage(FindWindow(NULL,"Receive"),WM_SEND,0,(LPARAM)&stu); //已发送成功
//接收端@VS MFC工程
LRESULT CReceiveDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
Student* stu=(Student *)lParam;
int n = stu->age; //数据不对
char nam[10];
strcpy(nam, stu->Name); //乱码
delete stu;
return 0;
}
如上,PostMessage给其他程序发送结构体接收到的数据会乱码,SendMessage的WM_COPYDATA不考虑,效率偏低,也不考虑共享内存的方法,只想通过PostMessage给其他程序发送结构体。请问各位有什么解决方法呢?
------最佳解决方案--------------------
而且不同进程之间最好用共享内存.
------其他解决方案--------------------
PostMessage(FindWindow(NULL,"Receive"),WM_SEND,0,(LPARAM)stu);
把&去掉
------其他解决方案--------------------
FILE_MAP_WRITE,0,0,0);
if(pv!=NULL){
memcpy(pv,ss.str().c_str(),sz);
memset((char*)pv+sz,0,256-sz);
UnmapViewOfFile(pv);
}
//send to target process
DWORD idProcess;
GetWindowThreadProcessId(hwnd,&idProcess);
HANDLE hProcess= OpenProcess(PROCESS_DUP_HANDLE,FALSE,idProcess);
HANDLE hDup=0;
DuplicateHandle(GetCurrentProcess(),hFile,hProcess,&hDup,NULL,FALSE,DUPLICATE_SAME_ACCESS);
PostMessage(hwnd,WM_MSG_SEND,0,(LPARAM)hDup);
CloseHandle(hFile);
/*
if(pStream->Write(ss.str().c_str(),ss.str().size(),NULL)!=S_OK){
cout<<"stream write fail"<<endl;
}
HGLOBAL hgb=NULL;
//PostMessage(hwnd,WM_MSG_SEND,0,(LPARAM)hgb);
GetHGlobalFromStream(pStream,&hgb);
pStream->Release();
ULONG sz=GlobalSize(hgb);
*/
cout<<"item posted, bytes ="<<sz<<endl<<endl;
CoUninitialize();
}else{
break;
}
} while (1);
return 0;
}
接收端:
#include <windows.h>
#include <stdio.h>
#include <sstream>
using namespace std;
struct Stu{
char name[10];
int m_nAge;
};
istream& operator>>(istream& is,Stu& x)
{
is>>x.name;
is>>x.m_nAge;
return is;
}
ostream& operator<<(ostream& os,Stu& x)
{
os<<x.name;
os<<x.m_nAge;
return os;
}
#define WM_MSG_SEND WM_USER+125
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("RecvData") ;
HWND hwnd ;
MSG msg ;