如何判断我的程序的一个实例是否正在运行?我以为我可以用数据文件做这个但它只是凌乱:(
我想这样做,因为我只希望一个实例在一个点上打开.
我正在处理一个应用程序,在任何给定时间只能存在一个实例.有几种可能性来实现这一目标:
互斥选项在我看来是最可靠和优雅的.
但是,在我的第二个实例终止之前,我想向已经运行的实例发布一条消息.为此,我需要一个拥有互斥锁的线程(或进程)的句柄.
但是,似乎没有API函数来获取给定互斥锁的创建者/所有者.我只是俯视它吗?有没有其他方法来到这个线程/进程?还有另一种方法可以解决这个问题吗?
更新:这个人只是向所有正在运行的进程广播一条消息.我想这是可能的,但我真的不喜欢它......
我想发送一条记录,现在只有一个字符串,但我会添加更多的变量.这是我第一次使用记录,所以这可能是一个愚蠢的问题.但是,为什么这样做:
type
TDataPipe = record
WindowTitle: String[255];
end;
var
Data: TDataPipe;
copyDataStruct : TCopyDataStruct;
begin
Data.WindowTitle:= String(PChar(HookedMessage.lParam));
copyDataStruct.dwData := 0;
copyDataStruct.cbData := SizeOf(Data);
copyDataStruct.lpData := @Data;
SendMessage(FindWindow('TForm1', nil), WM_COPYDATA, Integer(hInstance), Integer(@copyDataStruct));
end;
Run Code Online (Sandbox Code Playgroud)
接收方:
type
TDataPipe = record
WindowTitle: String[255];
end;
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sampleRecord : TDataPipe;
begin
sampleRecord.WindowTitle:= TDataPipe(Msg.CopyDataStruct.lpData^).WindowTitle;
Memo1.Lines.Add(sampleRecord.WindowTitle);
end;
Run Code Online (Sandbox Code Playgroud)
为什么如果在记录中,我使用:
WindowTitle: String; //removed the fixed size
Run Code Online (Sandbox Code Playgroud)
在发送方面我使用:
Data.WindowTitle:= PChar(HookedMessage.lParam); //removed String()
Run Code Online (Sandbox Code Playgroud)
它根本不去?
我得到访问冲突/ app冻结...
场景是:发送端是一个使用SetWindowsHookEx挂钩的DLL,接收端加载/调用SetWindowsHookEx的简单exe ...