我编了个关联exe文件的程序,但不知道怎么退出windows
每当运行一个exe文件,我的程序就会运行,于是找到一篇
防止一个程序二次运行的文章,并严格照做,结果——程序一次
也不运行了
总结一下,两问:1。怎么让监控程序关联exe文件后能正常退出windows??
                2。怎样让一个程序只运行一次,而且能运行一次
请各位高手帮忙!!谢谢了!!!!

解决方案 »

  1.   

    第二问题:
    方法:
    procedure LookForPreviousInstance;
    var
      PreviousInstanceWindow : hWnd;
      AppName : array[0..30] of char;
      FoundAtom : TAtom;
    begin
      AtomText:='OnlyOne'+Application.title;
      FoundAtom := GlobalFindAtom(PChar(AtomText));
      if FoundAtom <> 0 then
      begin
        ShowMessage('该程序已经远行了!');
        StrFmt(AppName,'%s', [Application.Title]);
        Application.ShowMainForm := false;
        Application.Title := 'destroy me';
        PreviousInstanceWindow := FindWindow(nil,AppName);
        Application.Terminate;    if PreviousInstanceWindow <> 0 then
          if IsIconic(PreviousInstanceWindow) then
               ShowWindow(PreviousInstanceWindow,SW_RESTORE)
          else SetForegroundWindow(PreviousInstanceWindow);
      end;
      FoundAtom := GlobalAddAtom(PChar(AtomText));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      inherited;
      LookForPreviousInstance;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
      FoundAtom : TAtom;
      ValueReturned : word;
    begin
      FoundAtom := GlobalFindAtom(Pchar(AtomText));
      if FoundAtom <> 0 then ValueReturned := GlobalDeleteAtom(FoundAtom);
    //  inherited Destroy;
    end;
    方法二:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if GlobalFindAtom('PROGRAM_RUNNING') = 0 then 
        fAtom := GlobalAddAtom('PROGRAM_RUNNING')
      else
        begin
          ShowMessage('该程序已经运行了!');
          Halt; 
        end; 
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
     GlobalDeleteAtom(fAtom); 
    end;
    方法三:
    initialization
      Project:='RunOnlyOnce_MyProject';
      mHandle:=CreateMutex(nil,True,PChar(Project));
      if GetLastError=ERROR_ALREADY_EXISTS then
        begin
          ShowMessage('该程序已经运行了!');
          AppName:=Application.Title;
          Application.ShowMainForm:=False;
          Application.Title:='destroy me';
          PreviousInstanceWindow:=FindWindow(nil,PChar(AppName));
          if PreviousInstanceWindow<>0 then
            if IsIconic(PreviousInstanceWindow) then
              ShowWindow(PreviousInstanceWindow,SW_RESTORE)
            else
              SetForegroundWindow(PreviousInstanceWindow);
            Application.Terminate;
        end;
    finalization
      if mHandle<>0 then
        CloseHandle(mHandle);
      

  2.   

    刚试了方法二,结果编译通过,可当我把它关掉再运行,就一次也不运行了
    请问这是什么原因??
    另外,方法三的代码是加在哪?.dpr内吗?
    方法一还没来得及试,要下班了
    明天来看你们的好消息
    在次先谢谢了!!!
      

  3.   

    方法三98下有时可以,有时不可以:当我去掉‘showmessage('该程序已经运行了!')’后,程序就一
    次也不运行,而加上那句后,又可运行,反复试了几次都这样,简直像是天方夜谭,可偏偏发生了
    郁闷的是在实际使用中,不可能保留那句的
    请各位高手指点一下!!在次先谢过了!!