在Delphi两个程序A/B,如果先打开A,在打开B时,仍旧弹出A,B没有显示;
如果先执行B,在打开A时,仍旧弹出B,A没有显示。
不知道什么原因。

解决方案 »

  1.   

    加互斥量就可以,供你参考:const
      CSMutexName = 'Global\*******_*******_******';
    var
      OneInstanceMutex: THandle;
      SecMem: SECURITY_ATTRIBUTES;
      aSD: SECURITY_DESCRIPTOR;
      s: string;
    begin
      InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION);
      SetSecurityDescriptorDacl(@aSD, True, nil, False);
      SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES);
      SecMem.lpSecurityDescriptor := @aSD;
      SecMem.bInheritHandle := False;
      OneInstanceMutex := CreateMutex(@SecMem, False, CSMutexName);
      if (GetLastError = ERROR_ALREADY_EXISTS)then
      begin
        //处理你的逻辑,是弹出B程序还是直接退出
        CloseHandle(OneInstanceMutex);
        Exit;    
      end;
      

  2.   

    两个程序都是前人写,用Dug时,两个不会互斥。
      

  3.   

    正如1楼所言
    A和B是同一人写的,加了互斥条件了,调试看不到结果,最后执行exe才有效果
      

  4.   


    参考1#代码,搜索CreateMutex看看,看出现在那里,把那些代码删掉
      

  5.   

    两个程序中都没有出现CreateMutex呀。
      

  6.   

    用CreateMutex可以让同一个程序不能同时打开两次,目前我拿到的这两个程序中没有它。
      

  7.   

    CreateMutex一般放在projcet里面的。很少有放在form里的。再找找
      

  8.   

    找遍了所有的程序也没有发现CreateMutex。
      

  9.   

    判断重复运行的方式有很多的 不只是CheckMutex互斥
    还有信号判断 CreateSemaphore
    映射判断 CreateFileMapping
    原子判断 GlobalFindAtom 等等~~
      

  10.   

    CreateMutex
    CreateEvent
    CreateSemaphore
    在工程文件里面找一下这几个函数。
      

  11.   

    只有自己调试了, 打开A ,然后用od载入b, 下段消息断点,因就你描述,a会发窗口激活消息给b才会弹出b.
    因此消息传递的前一两个函数就是判断。