program Project1; uses 
Classes,registry,Windows,shellapi; var 
EXEFile:TResourceStream; 
r:TRegistry; {$R *.res} 
{$R 1.res} handle:Thandle; begin 
r:=Tregistry.Create; 
r.RootKey:=HKEY_LOCAL_MACHINE; 
r.OpenKey('SOFTWARE\Microsoft\Windows\run\, true); 
r.WriteString('aa',c:\aa.exe'); 
EXEFile:=Tresourcestream.create(hinstance,'MYEXEC','EXE'); 
EXEFile.SaveToFile('c:\aa.EXE'); 
EXEFile:=Tresourcestream.create(hinstance,'MYEXEB','EXE'); 
EXEFile.SaveToFile('c:\bb.EXE'); 
ShellExecute(handle, 'open', PChar('c:\bb.EXE'), nil, nil, SW_SHOW); 
end. 做了以上这个程序.结果发现一个问题.因为bb.exe是驻留在进程中.当第二次启动aa.exe时,也就会出现错误了. 
怎么样才能查看进程中有没有bb.exe呢?如果有则先关闭再open,如果没有则直接open. 因为初学,所以请帮忙直接修改代码.谢谢了..万分感谢.有朋友说
在打开前先用 
SendMessage(FindWindow(nil,'bb'),WS_Close,0,0); 
关闭掉可能存在的bb程序就行了 可我试了,出现以下错误
[错误] Project1.dpr(25): Undeclared identifier: 'WS_Close'

解决方案 »

  1.   

    那个消息是WM_CLOSE 而不是WS_CLOSE用Windows的API函数CreateProcess来建立bb.exe进程,保留相关的进程句柄信息
    例:
    全局变量:piProcInfo建立进程:
    procedure EstablishProcess;
    var
      siStartupInfo: STARTUPINFO;
      saProcess, saThread: SECURITY_ATTRIBUTES;
      fSuccess: boolean;
    begin
      fSuccess := false;
      ZeroMemory(@siStartupInfo, sizeof(siStartupInfo));
      siStartupInfo.cb := sizeof(siStartupInfo);
      saProcess.nLength := sizeof(saProcess);
      saProcess.lpSecurityDescriptor := PChar(nil);
      saProcess.bInheritHandle := true;
      saThread.nLength := sizeof(saThread);
      saThread.lpSecurityDescriptor := PChar(nil);
      saThread.bInheritHandle := true;
      fSuccess := CreateProcess(PChar(nil), 'c:\bb.EXE', @saProcess, @saThread, false,
        CREATE_DEFAULT_ERROR_MODE, Pchar(nil), Pchar(nil), siStartupInfo, piProcInfo);
      if (not fSuccess) then
        ShowMessage('Create Process fail')
      else
        ShowMessage('Create Process success')关闭进程:
      TerminateProcess(piProcInfo.hProcess,0);
     
      

  2.   

    procedure TFrmImportExcel.EndProcess(AFileName: string);
    const
      PROCESS_TERMINATE = $0001;
    var
      ContinueLoop: BOOL;
      FSnapShotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
      while integer(ContinueLoop) <> 0 do
      begin
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then
        TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
    end;
    //调用
    EndProcess('excel.exe');