我發送以下 C 應用程式請求:
string data_to_send = "Hello World";
PCSTR lpszString = data_to_send.c_str();
COPYDATASTRUCT cds;
cds.dwData = 0; // can be anything
cds.cbData = sizeof(TCHAR) * (data_to_send.size());
cds.lpData = &lpszString;
cout << lpszString << endl;
SendMessage(Output, WM_COPYDATA, (WPARAM)Output, (LPARAM)(PVOID)&cds);
我在 Delphi 中使用以下代碼獲取結構
var
p : PCopyDataStruct;
s : UTF8String;
begin
p := PCopyDataStruct(Message.lParam);
if (p <> nil) then
begin
SetString(s, PAnsiChar(p^.lpData), p^.cbData);
ShowMessage(s);
end else
inherited;
end;
字串看起來不對。在除錯器中,它等于以下
'l'#$FE#$F6#2'Hello World'#0#$10#3#$88'u'#$B#0
我們看到訊息前有 22 個位元組和額外的 4 個位元組。如果我們使用 CHAR 而不是 TCHAR,那么我們會看到 11 個位元組,但偏移量還是 4 個位元組
#$18#$F9#$1B#3'Hello W'
請幫忙!!!
更新:
感謝Remy Lebeau的幫助,他的代碼按照最初的預期完成了一切, 感謝David Heffernan的正確評論!他們救了我。這是作業代碼。
uj5u.com熱心網友回復:
在 C 方面:
cds.dwData不應為 0。使用更獨特的值,例如呼叫的結果RegisterWindowMessage()。許多應用程式,甚至內部的 VCL,都WM_COPYDATA用于不同的目的,因此您不想誤將其他人的訊息混淆。sizeof(TCHAR)應該sizeof(char)改為(或完全省略,因為sizeof(char)始終為 1)。cds.lpData = &lpszString;需要cds.lpData = lpszString;改為。您發送的是lpszString變數本身的地址,而不是它指向的字符資料的地址。這就是為什么您在另一端看到垃圾的原因-您從lpszString駐留的呼叫堆疊中看到隨機位元組,在您的情況下包括std::string物件(其內部成員恰好包括一個短字串優化緩沖區,這就是為什么您也看到了你的角色)。
在德爾福方面:
p^.dwData在進一步處理訊息之前,您應該驗證您的唯一號碼。如果數字與您的預期不符,請將訊息傳遞給inherited處理程式并繼續。UTF8String應該是AnsiString,除非發件人std::string實際上是 UTF-8 編碼的。
嘗試這個:
const UINT uMyDataID = RegisterWindowMessage(TEXT("MyDataID"));
...
if (uMyDataID != 0)
{
string data_to_send = u8"Hello World";
COPYDATASTRUCT cds;
cds.dwData = uMyDataID;
cds.cbData = sizeof(char) * data_to_send.size();
cds.lpData = const_cast<char*>(data_to_send.c_str());
// or: cds.lpData = data_to_send.data(); in C 17 and later
SendMessage(Output, WM_COPYDATA, reinterpret_cast<WPARAM>(Output), reinterpret_cast<LPARAM>(&cds));
}
var
uMyDataID: UINT = 0;
...
procedure TMyForm.WMCopyData(var Message: TMessage);
var
p : PCopyDataStruct;
s : UTF8String;
begin
p := PCopyDataStruct(Message.lParam);
if (uMyDataID <> 0) and (p <> nil) and (p^.dwData = uMyDataID) then
begin
SetString(s, PAnsiChar(p^.lpData), p^.cbData);
ShowMessage(s);
end else
inherited;
end;
...
initialization
uMyDataID := RegisterWindowMessage('MyDataID');
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527218.html
標籤:C 温纳皮德尔福
