【问题标题】:Delphi: How to send an Array of Variant from DLL to Application using Windows API "SendMessage"?Delphi:如何使用 Windows API“SendMessage”将变量数组从 DLL 发送到应用程序?
【发布时间】:2014-09-03 12:43:33
【问题描述】:

我需要将数据从 DLL 发送到 App,其中“数据”是一个变体数组。

我尝试使用 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; 

【问题讨论】:

  • WM_COPYDATA 发送单个连续数据块。 Delphi 数组不太可能是这样的结构。
  • 序列化数组并使用 WM_COPYDATA。或者使用 COM 轻松生活。

标签: delphi winapi dll sendmessage


【解决方案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; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2011-04-28
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2011-08-04
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多