2014-09-03 109 views
0

我需要將數據從DLL發送到應用程序,其中「數據」是一個變體數組。Delphi:如何使用Windows API「SendMessage」將DLL中的Variant數組發送給應用程序?

我試圖使用SendMessage/WM_COPYDATA,沒有運氣!

這是我得到迄今:

// sender's side (dll) 
procedure sendData(apphandle: THandle); 
var V: Variant; 
begin 
    V = VarArrayOf([1,'Some Text', 123.45, true]); 
    copyDataStruct.dwData := 100; 
    copyDataStruct.cbData := ?; <-- what here? 
    copyDataStruct.lpData := ?; <-- and here? how to put "V"? 
    SendMessage(apphandle, WM_COPYDATA, Integer(apphandle), Integer(@copyDataStruct)) ; 
end; 


// receiver's side (same app where dll was called) 
procedure WMCopyData(var Msg: TWMCopyData) ; 
var V : Variant; 
begin 
    if (Msg.CopyDataStruct.dwData = 100) then 
    begin 
     V := Msg.CopyDataStruct.lpData; <-- how to get "V" from lpData? 
     // do some work with "V" here... 
    end; 
end; 
+0

'WM_COPYDATA'發送一個連續數據塊。德爾菲陣列不太可能像這樣構造。 – 2014-09-03 12:49:01

+0

序列化數組並使用WM_COPYDATA。或者使用COM來獲得簡單的生活。 – 2014-09-03 12:55:46

回答

1

只要應用程序和DLL使用RTL同一版本,而你周圍傳遞Variant相同的過程中,你可以通過它作爲一個指針,如:

procedure sendData(AppHandle: HWND); 
var 
    V: Variant; 
begin 
    V := VarArrayOf([1,'Some Text', 123.45, true]); 
    copyDataStruct.dwData := 100; 
    copyDataStruct.cbData := SizeOf(Pointer); 
    copyDataStruct.lpData := @V; 
    SendMessage(AppHandle, WM_COPYDATA, WPARAM(AppHandle), LPARAM(@copyDataStruct)); 
end; 

procedure WMCopyData(var Msg: TWMCopyData); 
var 
    V : PVariant; 
begin 
    if (Msg.CopyDataStruct.dwData = 100) then 
    begin 
    V := PVariant(Msg.CopyDataStruct.lpData); 
    // use V^ as needed... 
    end; 
end; 

在這種情況下,你可能會下降WM_COPYDATA,只是改用自定義窗口消息:

const 
    WM_MYMSG = WM_APP + 1; 

procedure sendData(AppHandle: HWND); 
var 
    V: Variant; 
begin 
    V := VarArrayOf([1,'Some Text', 123.45, true]); 
    SendMessage(AppHandle, WM_MYMSG, 0, LPARAM(@V)); 
end; 

procedure WMMyMsg(var Msg: TMessage); 
var 
    V : PVariant; 
begin 
    V := PVariant(Msg.LParam); 
    // use V^ as needed... 
end; 
+0

太棒了!它像一個魅力!謝謝! – Christian 2014-09-03 19:12:14

相關問題