2014-09-03 5 views
0

DLL에서 App으로 데이터를 보내야합니다. 여기서 "data"는 변형의 배열입니다.Delphi : Windows API "SendMessage"를 사용하여 DLL에서 응용 프로그램으로 변종을 보내는 방법?

나는 행운과 함께 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'는 하나의 인접한 데이터 덩어리를 보냅니다. 델파이 배열은 그렇게 구조화 될 것 같지 않습니다. –

+0

배열을 serialize하고 WM_COPYDATA를 사용하십시오. 또는 COM을 사용하면 쉽게 사용할 수 있습니다. –

답변

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