c#向VC的窗口发消息,怎么传递string
c#向VC的窗口发消息,怎么传递string --------------------编程问答-------------------- 通过 SendMessage(hwnd, CmdId, wParam, lParam)发送 --------------------编程问答-------------------- 对于地址传递,直接不行,需要映射到本进程空间,所以你还是用内存映射,将内容存到指定内存地址,燃后发消息让其他进程去读 --------------------编程问答-------------------- C#不熟悉,能够给个例子 --------------------编程问答-------------------- SendMessage就可以 --------------------编程问答--------------------
确实,比较麻烦。因为string一般需要包装成地址传递,但是不同进程的地址是无法直接使用的。
必须依靠其它进程间通讯的手段来传递。当然有一个变通的办法,就是在某一方程序中使用一个文本框(隐藏的)来传值,使用wm_gettext。 --------------------编程问答-------------------- SendMessage
PostMessage
c#不熟悉,可以把这块用c/c++做成dll,c#调用。 --------------------编程问答-------------------- msdn search wm_copydata 消息 --------------------编程问答-------------------- // ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
COPYDATASTRUCT MyCDS;
MYREC MyRec;
HRESULT hResult;
BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
// ************ Code fragment ****************
// Get data from user. InfoDlgProc stores the information in MyRec.
//
DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
//
// Copy data into structure to be passed via WM_COPYDATA.
// Also, we assume that truncation of the data is acceptable.
//
hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
if (hResult != S_OK)
return False;
hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
if (hResult != S_OK)
return False;
MyRec.n = nAge;
//
// Fill the COPYDATA structure
//
MyCDS.dwData = MYPRINT; // function identifier
MyCDS.cbData = sizeof( MyRec ); // size of data
MyCDS.lpData = &MyRec; // data structure
//
// Call function, passing data in &MyCDS
//
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
(WPARAM)(HWND) hWnd,
(LPARAM) (LPVOID) &MyCDS );
else
MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
发送方
// ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
PCOPYDATASTRUCT pMyCDS;
void WINAPI MyDisplay( LPSTR, LPSTR, DWORD );
//
// ************ Code fragment ****************
//
case WM_COPYDATA:
pMyCDS = (PCOPYDATASTRUCT) lParam;
switch( pMyCDS->dwData )
{
case MYDISPLAY:
MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
(LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
(DWORD) ((MYREC *)(pMyCDS->lpData))->n );
}
break;
接受方的
--------------------编程问答-------------------- 如果你理解上边的程序,string 就简单了
用marshal.stringtoptrauto or stringtoptransi
补充:.NET技术 , C#