这个程序目的是用户登陆时,防止同一程序两次运行的,同一时间只能运行一次
procedure TRegForm.FormCreate(Sender: TObject);var
  WinName: array[0..127] of Char;
  Found: HWND;
begin
  StrPCopy(WinName, Application.Title);
  Application.Title := 'Only_' + IntToStr(HInstance);
  Found := FindWindow(nil, WinName);
  Application.Title := WinName;
  if Found <> 0 then
  begin
    ShowWindow(Found, SW_RESTORE);
    Application.Terminate;
  end
  else
  begin
    Registry := TRegistry.Create;
    Registry.RootKey := HKEY_CURRENT_USER;
    Registry.OpenKey('RegData\PassWord', False);
    Pass := Registry.ReadString(''); //读入密码
    Registry.Free;
  end;
end;

解决方案 »

  1.   

    Application.Title := 'Only_' + IntToStr(HInstance); 
    这又是什么意思
      

  2.   

    很明显,根据Application的名字去查找窗口句柄,判断是否已存在另一个实例。如果不先改名,就会查找到自己。然后查找完再把名字改回来。HInstance是当前应用程序在Windows中的实例句柄,你可以理解为它对每个程序唯一。这句不是必需的,你用随机数或者GUID也可以。
      

  3.   

    HInstance可不是系统给的进程id之类的,而是当前进程中的模块句柄,也就是在2g的用户态可用地址中,该模块被映射到的地址
    delphi链接器默认的image base是$00400000,而且一般也没人去改这个地址,所以exe程序(不像dll容易发生冲突被重定向到别的地址)的HInstance一般都是$00400000
      

  4.   

    楼上,试验了下,果真如此。这么说来他把Application.Title赋值成这个没什么意思。