1,593
社区成员
发帖
与我相关
我的任务
分享
procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
[/quote]
我测试了其中设置SetParent前后发送WM_COPYDATA消息的代码,可以正常接收数据。你单步调试或输出一下调试信息,看看SendMessage是否执行到了。另外,WinExec只运行了一次B程序吗?procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
[/quote]
我测试了其中设置SetParent前后发送WM_COPYDATA消息的代码,可以正常接收数据。你单步调试或输出一下调试信息,看看SendMessage是否执行到了。另外,WinExec只运行了一次B程序吗?[/quote]
对,只运行了一次。
A、B两个单独的EXE,这种情况下发送消息是没问题的。问题是SetParent,B嵌入了A之后,再发消息,B就不响应了。
Q:742612641[/quote]
重复一遍也提供不了更多信息。应该输出调试信息,逐步缩小范围,定位发送和接收方哪边的问题,以及SetParent前后句柄信息等是否发生变化。[/quote]
感谢提醒!首先我在调用B的时候,获取到B的句柄。其次再给B发送消息的时候,再获取B的句柄的时候,前后两句柄值是不一致的。于是就统一句柄值,问题就解决了。谢谢,稍后结贴。[/quote]
客气,解决就好。procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
[/quote]
我测试了其中设置SetParent前后发送WM_COPYDATA消息的代码,可以正常接收数据。你单步调试或输出一下调试信息,看看SendMessage是否执行到了。另外,WinExec只运行了一次B程序吗?[/quote]
对,只运行了一次。
A、B两个单独的EXE,这种情况下发送消息是没问题的。问题是SetParent,B嵌入了A之后,再发消息,B就不响应了。
Q:742612641[/quote]
重复一遍也提供不了更多信息。应该输出调试信息,逐步缩小范围,定位发送和接收方哪边的问题,以及SetParent前后句柄信息等是否发生变化。[/quote]
感谢提醒!首先我在调用B的时候,获取到B的句柄。其次再给B发送消息的时候,再获取B的句柄的时候,前后两句柄值是不一致的。于是就统一句柄值,问题就解决了。谢谢,稍后结贴。procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
[/quote]
我测试了其中设置SetParent前后发送WM_COPYDATA消息的代码,可以正常接收数据。你单步调试或输出一下调试信息,看看SendMessage是否执行到了。另外,WinExec只运行了一次B程序吗?[/quote]
对,只运行了一次。
A、B两个单独的EXE,这种情况下发送消息是没问题的。问题是SetParent,B嵌入了A之后,再发消息,B就不响应了。
Q:742612641[/quote]
重复一遍也提供不了更多信息。应该输出调试信息,逐步缩小范围,定位发送和接收方哪边的问题,以及SetParent前后句柄信息等是否发生变化。procedure SendMessagetoSys(AState: string);
var //向系统发送执行命令
ds: TCopyDataStruct;
HdServer,MyHwnd: HWND;
ProcessName: string; //进程名
FSnapshotHandle: THandle; //进程快照句柄
FProcessEntry32: TProcessEntry32; //进程入口的结构体信息
ContinueLoop: BOOL;
const
AOrderText = '开始执行';
begin
ds.cbData := Length(AOrderText) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(AOrderText));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建一个进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32.szExeFile;
if (ProcessName = 'B.exe') then
begin
MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID);
if MyHwnd <> 0 then
begin
SendMessage(MyHwnd, WM_COPYDATA, Handle, Cardinal(@ds)); //发送WM_COPYDATA消息
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
FreeMem(ds.lpData); //释放资源
end;
[/quote]
我测试了其中设置SetParent前后发送WM_COPYDATA消息的代码,可以正常接收数据。你单步调试或输出一下调试信息,看看SendMessage是否执行到了。另外,WinExec只运行了一次B程序吗?[/quote]
对,只运行了一次。
A、B两个单独的EXE,这种情况下发送消息是没问题的。问题是SetParent,B嵌入了A之后,再发消息,B就不响应了。
Q:742612641