gpt4 book ai didi

c++ - 如何修复 'Receiver application gets empty message via WM_COPYDATA' 问题?

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:24 25 4
gpt4 key购买 nike

我正在用 C++ 编写一个应用程序,它将向一个用 Delphi 编写的应用程序发送一条消息。

这是我的接收器应用:

image

单击按钮时,Edit1.Text 将作为命令行参数通过 ShellExecute() 发送到发送方应用 (C++)。

发送方应用会将参数作为 WM_COPYDATA 消息发送回接收方应用,后者将在 Edit2 文本框中显示它。

这是 Delphi 应用程序的代码(Delphi 10.3 Rio):

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'deneme.exe', PWideChar(Edit1.Text), nil, SW_HIDE);
end;

procedure TForm1.MesajAl(var Mesaj: TMessage);
var
Veri: PCopyDataStruct;
begin
Veri := Pointer(Mesaj.LParam);
Edit2.Text := PChar(Veri^.lpData);
end;

这是我的 C++ 应用程序代码(Code::Blocks IDE):

#include <iostream>
#include <windows.h>
#include <tchar.h>
using namespace std;

int main(int argc, char* argv[])
{
if (argc < 2)
{
return 0;
}
else
{
HWND hwnd = FindWindow(NULL, "Form1");

string alinanMesaj;

LPCTSTR gonderilecekMesaj = alinanMesaj.c_str();

COPYDATASTRUCT cds;
cds.cbData = sizeof(TCHAR)*(_tcslen(gonderilecekMesaj) + 1);
cds.dwData = 1;
cds.lpData = (PVOID)gonderilecekMesaj;

SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);

return 0;
}
}

问题是 Edit2 文本框什么都不显示。

顺便说一句,我在这个网站上做了一个关于WM_COPYDATA的研究。但是尽管是这种情况,我还是无法自己解决问题。

那么,我应该怎么做才能解决我的问题?

最佳答案

我发现这段代码存在三个问题:

  • 发送方正在发送空白数据,因为 alinanMesaj 未分配任何值。

  • 这两个应用之间存在 ANSI/UNICODE 不匹配。 Delphi 代码使用 Unicode 字符串,而 C++ 代码使用 ANSI 字符串。 WM_COPYDATA 对字节而不是字符进行操作。您必须为您的字符串数据选择一种字节编码,并使其在两端保持一致。

  • VCL内部使用了WM_COPYDATA,所以发送方需要将cds.dwData字段设置为唯一值,比如来自RegisterWindowMessage( ),接收方在解释 cds.lpData 数据之前必须验证。

如上所说,试试这个:

var
MY_CDS_ID: UINT;

procedure TForm1.FormCreate(Sender: TObject);
begin
MY_CDS_ID := RegisterWindowMessage('MYCDSID'); // use whatever unique name you want
if MY_CDS_ID = 0 then
RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// you really should be using CreateProcess() instead...
ShellExecute(0, nil, 'deneme.exe', PChar(AnsiQuotedStr(Edit1.Text, '"')), nil, SW_HIDE);
end;

procedure TForm1.MesajAl(var Mesaj: TMessage);
var
Veri: PCopyDataStruct;
s: UnicodeString;
begin
Veri := Pointer(Mesaj.LParam);
if Veri^.dwData = MY_CDS_ID then
begin
SetString(s, PWideChar(Veri^.lpData), Veri^.cbData div SizeOf(WideChar));
Edit2.Text := s;
end else
inherited;
end;
#include <iostream>
#include <windows.h>
#include <string>

int main(int argc, char* argv[])
{
if (argc < 2)
return 0;

HWND hwnd = FindWindow("TForm1", "Form1");
if (!hwnd)
return 0;

UINT MY_CDS_ID = RegisterWindowMessage("MYCDSID"); // must match the named used by the Delphi code
if (!MY_CDS_ID)
return 0;

std::wstring alinanMesaj;

int arglen = lstrlenA(argv[1]);
int wlen = MultiByteToWideChar(CP_ACP, 0, argv[1], arglen, NULL, 0);
if (wlen > 0)
{
alinanMesaj.resize(wlen);
MultiByteToWideChar(CP_ACP, 0, argv[1], arglen, &alinanMesaj[0], wlen);
}

COPYDATASTRUCT cds;
cds.cbData = sizeof(wchar_t) * alinanMesaj.size();
cds.dwData = MY_CDS_ID;
cds.lpData = const_cast<wchar_t*>(alinanMesaj.c_str());

SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>(hwnd), reinterpret_cast<LPARAM>(&cds));

return 0;
}

关于c++ - 如何修复 'Receiver application gets empty message via WM_COPYDATA' 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com