64位程序和32位程序通訊問題

2021-07-25 22:39:48 字數 1716 閱讀 4723

最近遇到乙個問題,64位程式向32位程式傳送乙個wm_copydata訊息, 發現傳遞的資料和收到的資料不對

函式**如下,

typedef

struct tagcopydatastruct copydatastruct, *pcopydatastruct;

傳送方(64位程式)

void csenddlg::ondatasend()

接收方(32位程式)

// 宣告

afx_msg void oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct);

// 新增訊息對映

begin_message_map(cmainframe, ccjmdiframewnd)

on_message(wm_copydata,oncopydata)

end_message_map()

// 函式實現

creceivedlg::oncopydata( wparam wparm, lparam lparm)

原因

經分析,是由於傳遞資料是用的指標,所以會出現乙個問題:指標在64位下的長度為64位,而在32位下的長度為32位,故當64位情況下指標高位元組不為空時,實際上32位程式收到的指標只有低位元組部分,高位元組被擷取了。

解決辦法

傳送方(64位程式)自定義乙個訊息通知接收方(32位程式),並把要傳遞的資料及相關引數的值保持到本地檔案;接收方收到訊息後,讀取本地檔案的值,再給自己傳送wm_copydata訊息(這樣寫的好處是wm_copydata的響應函式不用改寫)。

**如下

傳送方(64位程式)

// 定義訊息

**#define wm_usermsg wm_user +

1111

void csenddlg::ondatasend()

接收方(32位程式)

// 定義自定義訊息

**#define wm_usermsg wm_user + 1111

// 宣告

afx_msg void oncopydata(wparam wparm, lparam lparm);

afx_msg void onuermsg(wparam wparm, lparam lparm);

// 新增訊息對映

begin_message_map(cmainframe, ccjmdiframewnd)

on_message(wm_copydata,oncopydata)

on_message(wm_usermsg,onuermsg)

end_message_map()

// wm_copydata訊息響應函式實現

creceivedlg::oncopydata( wparam wparm, lparam lparm)

// wm_usermsg訊息響應函式實現

creceivedlg::onuermsg( wparam wparm, lparam lparm )

32位程序注入64位程序

include include define makerex w,r,x,b asm emit 0100 w r x b b define rep asm emit 0xf3 pragma pack 1 typedef struct stubargs stubargs,pstubargs pragm...

64位程序呼叫32位dll的解決方法

最近做在windows xp x64,vs2005環境下做32位程式編譯為64位程式的工作,遇到了一些64位程式設計中可能遇到的問題 如內聯彙編 解決方法改為c c long型別的變化,最關鍵的遇到了64位程序需要呼叫32位dll的問題。由於有一些32位dll沒有源 無法重新編譯為64位dll,所以...

64位程序呼叫32位dll的解決方法

最近做在windows xp x64,vs2005環境下做32位程式編譯為64位程式的工作,遇到了一些64位程式設計中可能遇到的問題 如內聯彙編 解決方法改為c c long型別的變化,最關鍵的遇到了64位程序需要呼叫32位dll的問題。由於有一些32位dll沒有源 無法重新編譯為64位dll,所以...