我們使用 向另一個應用程式發送訊息SendMessageTimeout(),但我們注意到最后一個引數結果沒有回傳預期值。例子:
var
ReturnValuePtr: PDWORD_PTR;
begin
ReturnValuePtr := nil;
SendMessageTimeout(OtherAppHandle,
WM_COPYDATA,
0,
LPARAM(@CopyDataStruct),
SMTOFlag,
CTimeout,
ReturnValuePtr);
// Here ReturnValuePtr is still nil when we expect it to be a known value.
end;
但是,如果我們將代碼更改為傳遞@ReturnValuePtr給SendMessageTimeout(),如下所示:
begin
ReturnValuePtr:= nil;
SendMessageTimeout(OtherAppHandle,
WM_COPYDATA,
0,
LPARAM(@CopyDataStruct),
SMTOFlag,
CTimeout,
@ReturnValuePtr); // <- Only change here
// Here ReturnValuePtr returns the known expected value.
end;
這樣我們就可以得到正確的值ReturnValuePtr。
這是主要問題:為什么會這樣?它仍然正確嗎?
我們不確定上述內容是否正確,因此我們最終改為實施:
var
ReturnValue: NativeUInt;
ReturnValuePtr: PDWORD_PTR;
begin
ReturnValue := 0;
ReturnValuePtr := @ReturnValue;
SendMessageTimeout(OtherAppHandle,
WM_COPYDATA,
0,
LPARAM(@CopyDataStruct),
SMTOFlag,
CTimeout,
ReturnValuePtr);
// Here we check ReturnValue and it has the known expected value.
end;
uj5u.com熱心網友回復:
您必須為最后一個引數提供有效地址,以允許接收者用一些結果填充它。
當地址為 nil 時,接收方(或 Windows 訊息系統)無法將資料放在該地址。
也許您確實期望該函式會更改此地址,但它不能(否則引數型別應該是“指向指標的指標”)
所以你的最后一個變體是正確的
uj5u.com熱心網友回復:
最后一個引數需要一個指向有效DWORD_PTR變數的指標。該函式將在為變數賦值時取消參考指標。
在第一種情況下,您傳遞了一個nil指標,這是錯誤的。
盡管您不需要指標的顯式變數,但您需要做更多類似于第三種情況的操作,例如:
var
ReturnValue: DWORD_PTR;
begin
ReturnValue := 0;
SendMessageTimeout(OtherAppHandle,
WM_COPYDATA,
0,
LPARAM(@CopyDataStruct),
SMTOFlag,
CTimeout,
@ReturnValue);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/516719.html
標籤:德尔福
