2010-10-06 82 views
0

嗨我的問題是我的SendMessageIPC SendMessage問題

它的接縫從來沒有達到我的形式(我使用Winspector間諜來查看哪些消息是在我的表單中註冊的),這很奇怪,因爲我是舒爾我發送到正確的句柄目前的形式。

SendMessage是在一個DLL中,但不應該有任何事情與它做。

//sStr is just an input where i type in the Handler address; 
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct)); 

SendMessage每次返回0。

在接收端:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData; 

procedure TMainForm.WMCopyData(var Msg: TWMCopyData); 
var 
s : string; 
begin 
    s := PChar(Msg.CopyDataStruct.lpData); 
    showmessage(s); 
//Send something back 
    msg.Result := 2006; 
end; 

我還試圖像WM_CLOSE其他消息。有人知道爲什麼這會失敗嗎? 我使用的Delphi 5.

+0

你確定你傳遞正確的窗口句柄SendMessage函數?請先檢查一下。我假設這是一個正常形式的應用程序。 – Runner 2010-10-07 08:38:45

回答

1

的問題是,你不能

Integer(sStr) 

到表示一個整數(例如 '12345')爲整數(12345)將字符串轉換。

使用

StrToInt(sStr) 

代替。

的確,在技術上,一個字符串只是一個指向字符串頭+數據的指針。我想Integer(sStr)只是返回該指針。 (或者,實際上,簡單地將sStr視爲一個整數)。

也就是說,你應該做的

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct)); 
+0

沒有幫助,但感謝您的建議 – Roise 2010-10-06 16:20:32

+0

嗯,這不僅僅是一個建議。如果你編寫'Integer(sStr)',它肯定會*不起作用。當我做一個測試時,整數('12345')= 4605000'。 – 2010-10-06 16:23:10

+0

是的,即時通訊使用它,對不起,如果我聽起來尖銳或沒有采取你說的話,即時通訊只是說,它沒有解決我的問題,它是一個編程的漫長的一天:) – Roise 2010-10-06 16:28:42

1

的SendMessage消息定義是

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall; 

更新

對於MSG = WM_COPYDATA:

  • 第一個參數是一個句柄 接收數據的窗口
  • 第三個參數是一個句柄窗口 傳遞數據

如果你的名字的第一個參數SSTR我認爲它不是一個手柄,但一個字符串。

+0

錯誤如何?我的拳頭parm sStr是接收窗口的句柄,WM_CopyData是消息,Handle是dll的句柄,@copyDataStruct是要發送的數據。我不認爲這裏的錯。 – Roise 2010-10-06 15:55:31

+0

@Rosie:什麼數據類型是'sStr'? – 2010-10-06 15:58:23

+0

sStr是一個字符串。我手動輸入Handel中的定位表單。 – Roise 2010-10-06 16:10:54

0

我認爲問題是,你要使用的名稱或東西你的窗口,這是行不通的。

試試這個:

var 
    Wnd: HWnd; 
begin 
    Wnd := GetForegroundWindow(); // Assumes your target window is up front 
    // Fill in CopyData structure here. 
    SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct)); 
end;