最近遇到乙個問題,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,所以...