相关疑难解决方法(0)

如何判断我的程序的另一个实例是否已在运行?

如何判断我的程序的一个实例是否正在运行?我以为我可以用数据文件做这个但它只是凌乱:(

我想这样做,因为我只希望一个实例在一个点上打开.

delphi persistence mutex semaphore instance

29
推荐指数
5
解决办法
2万
查看次数

Win32:如何获取拥有互斥锁的进程/线程?

我正在处理一个应用程序,在任何给定时间只能存在一个实例.有几种可能性来实现这一目标:

  • 检查一个匹配EXE名称的运行进程(不可靠)
  • 找到主窗口(不可靠,我并不总是有一个主窗口)
  • 创建具有唯一名称(GUID)的互斥锁

互斥选项在我看来是最可靠和优雅的.

但是,在我的第二个实例终止之前,我想向已经运行的实例发布一条消息.为此,我需要一个拥有互斥锁的线程(或进程)的句柄.

但是,似乎没有API函数来获取给定互斥锁的创建者/所有者.我只是俯视它吗?有没有其他方法来到这个线程/进程?还有另一种方法可以解决这个问题吗?

更新:这个人只是向所有正在运行的进程广播一条消息.我想这是可能的,但我真的不喜欢它......

winapi multithreading mutex process single-instance

7
推荐指数
2
解决办法
1万
查看次数

SendMessage(WM_COPYDATA)+ Record + String

我想发送一条记录,现在只有一个字符串,但我会添加更多的变量.这是我第一次使用记录,所以这可能是一个愚蠢的问题.但是,为什么这样做:

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 ...

delphi

5
推荐指数
1
解决办法
3046
查看次数