1
我試圖從VBA向C++應用程序發送消息。我在下面的作品中,信息被髮送到我的消息映射(Yay!)。但是,我無法傳遞任何數據。我已經嘗試了幾種不同的方法,就像我的代碼中看到的那樣,但他們中沒有一個似乎在跨越LPARAM。在VBA中爲LParam發送LPARAM變量
任何幫助,將不勝感激!
VBA:
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const WM_APP = &H803C&
Sub Test()
Call SetPartNumber(123)
End Sub
Sub SetPartNumber(partNumber As Double)
Dim result As Long, hwnd As Long
partNumber2 = VarPtr(partNumber)
hwnd = FindWindow(vbNullString, "Data Collector")
result = PostMessage(hwnd, WM_APP, 0, partNumber2) ' attempt using a var pointer
result = PostMessage(hwnd, WM_APP, 0, partNumber) ' attempt using just the variable
End Sub
我的C++數據收集器:
BEGIN_MESSAGE_MAP(CCellDlg, CDialogEx)
ON_MESSAGE(WM_APP + 60, PleasePleaseWork)
END_MESSAGE_MAP()
LRESULT CCellDlg::PleasePleaseWork(WPARAM wParam, LPARAM lParam)
{
double partNumber = LOWORD(lParam);
double partNumber1 = HIWORD(lParam);
double partNumber2 = wParam;
double partNumber3 = lParam;
AfxMessageBox("Yay!");
return 0;
}
指針是在它們僅發起的過程有效,所以通過'VarPtr'跨進程邊界是沒有意義的。如果您從64位進程發送到另一個64位進程,傳遞「Double」值可能有用。取一個double的下半部分或上半部分仍然沒有意義:這不是浮點值的編碼方式。 – IInspectable
WM_COPYDATA可能是一個更好的選擇,因爲操作系統會爲您處理跨越邊界的複製問題。 –
我很擔心跨不同進程發送內存地址,而你說的話有意義......甚至當我意識到我正在使用PostMessage而不是SendMessage清除內存時更是如此。與SendMessage配對的WM_COPYDATA似乎有訣竅。謝謝! – CassieD