这是一个比较简单的防止程序执行两次的方法
implementation 
var hnd: THandle;initialization
    hnd := CreateMutex(nil, True, 'irgendwaseinmaliges');
    if GetLastError = ERROR_ALREADY_EXISTS then Halt;finalization
    if hnd <> 0 then CloseHandle(hnd);
end.

解决方案 »

  1.   

    有两个方法:
    1、程序运行时,用CreateMutex创建一个互斥对象。若已存在这样的对象,则自己退出
    2、用FindWindow查找是否存在同名的程序,如果有,则使Application中止
      

  2.   

    还可以使用原子 Atom:procedure CheckPrevInstance;
    var
      PrevWindow: HWND;
      i: Integer;
      Atom: TAtom;
    begin
      if GlobalFindAtom(PChar('MYPROGRAM_IS_RUNNING')) = 0 then
      begin
        CheckPreInsAtom := GlobalAddAtom(PChar('MYPROGRAM_IS_RUNNING'));
      end else
      begin
        repeat
          PrevWindow := FindWindow('MyFormClass', nil);
        until PrevWindow <> 0;
        for i := 1 to ParamCount do
        begin
          Atom := GlobalAddAtom(PChar(ParamStr(i)));
          // 这里给应用程序发出通知消息
          GlobalDeleteAtom(Atom);
        end;
        SetForeGroundWindow(PrevWindow); // 激活到前台
        // 通知激活
        Halt;
      end;
    end;
      

  3.   

    修改项目文件,修改begin和end之间的代码如下: 
    begin
      Application.Initialize;
      if FindWindow('TForm1','Form1')=0 then 
      begin 
        Application.CreateForm(TForm1, Form1);
        Application.Run;
      end;
    end.
      

  4.   

    : torble(阿裕) :你的'MYPROGRAM_IS_RUNNING'是什么东东?是程序名吗?
      

  5.   

    推荐 dreamfan(dreamfan) 的方法
      

  6.   

    共有三种方法:
    1.查找窗口法
      Begin 
       Hwnd:=FindWindow(‘TForm1’,‘SingleApp’); 
       If Hwnd=0 then 
       Begin 
       Application.Initialize; 
       Application.CreateForm(Tform1, Form1); 
       Application.Run; 
       End; 
      End; 
    2.使用互斥对象  
      VAR Mutex:THandle; 
      begin 
       Mutex:=CreateMutex(NIL,True,‘SingleApp’); 
       IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例 
       BEGIN 
       Application.CreateHandle; 
       Application.CreateForm (TExpNoteForm, ExpNoteForm); 
       Application.Run; 
       END; 
       ReleaseMutex(Mutex); 
      end. 
    3.全局原子法 
    我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由Windows 系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom 函数向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局原子。示例如下: 
      Uses Windows 
      const iAtom=‘SingleApp’; 
      begin 
       if GlobalFindAtom(iAtom)=0 then 
       begin 
       GlobalAddAtom(iAtom); 
       Application.Initialize; 
       Application.CreateForm(TForm1,Form1); 
       Application.Run; 
       GlobalDeleteAtom(GlobalFindAtom(iAtom)); 
       end 
       else 
       MessageBox(0,‘You can not run a second copy of this App’,‘’,mb_OK); 
      end. 
      利用全局原子的引用计数规则,我们还可以判断当前共运行了该程序的多少个实例: 
      var i:Integer; 
      begin 
       I:=0; 
      while GlobalFindAtom(iAtom)<>0 do 
       begin 
       GlobalDeleteAtom(GlobalFindAtom(iAtom)); 
       i:=i+1; 
       end; 
       ShowMessage(IntToStr(I)); 
      end; 
    祝你好运!