大家好!我的要求是一个程序一个实例运行.当我检测出有一个实例存在之后我要调用这个实例里的某些函数.请问这怎么才能调到.谢谢.
var
  MutexHandle: THandle;
begin
  MutexHandle := CreateMutex(nil, False, '{8EC3899A-98E0-42DE-9925-C19008E6ED74}');
  if (MutexHandle>0) and (GetLastError = ERROR_ALREADY_EXISTS) then begin
    //发现已经有实例创建,我怎么去调用它的一些函数呢?比如说我要调用这个实例的函数写在主窗体单元里.谢谢
    
    Halt;
  end;
    Application.Initialize;
    Application.CreateForm(THaoDongMain, HaoDongMain);
    Application.Run;
end.

解决方案 »

  1.   

    发了2个帖,误会楼主的意思了.
    简单点的一个sendmessage搞定
      

  2.   

    发现已经有实例创建,调用它的一些函数,用互斥量不行。调用函数需要用到自定义消息,用SendMessage发送消息很简单,关键是你的程序必须要有接受消息的接口。如果你把代码给我,我可以帮你续写你要的功能。详请加群:37802783
      

  3.   

    也没有什么代码.就是一个MDI程序.发现存在实例之后在这个实例上创建个子窗体.就这样...能给解答吗?
      

  4.   

    这个问题我具体回答下吧。 首先要在以下处添加代码: 
    Delphi(Pascal) code
        //发现已经有实例创建,我怎么去调用它的一些函数呢?比如说我要调用这个实例的函数写在主窗体单元里.谢谢
        BSMRecipients := BSM_APPLICATIONS; //BSMRecipients: DWORD;
        BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients,
                UMI_USERMESSAGE, 0, 0); //UMI_USERMESSAGE是一个自定义消息,不明白可以查看自定义消息相关资料;然后在主窗体处添加代码: const
      UMI_USERMESSAGE = WM_USER + $0101;var
      OldWProc: TFNWndProc;//接收并处理消息;
    function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
    begin
      result := 0;
      if Msg = UMI_USERMESSAGE then //接收的广播消息,在此处理;
      begin
        //楼主的操作;
      end;
      else
        Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
    end;initialization
      OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));finalization
      if OldWProc <> nil then
        SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));这样就能实现楼主的意愿。唯一一点就是如果想把已经创建的实例设置到前台,还需要其他处理。
      

  5.   

    const
      CSingleAppMutex = '{B6750F3B-0FBA-463e-8F0A-285B186C8F44}' ; //唯一打开标识if CheckOnlyRun(CSingleAppMutex) = False then  Exit;
    //检测是否此标识量已打开,没打开则打开
    function CheckOnlyRun( AMutexName : String): Boolean;
    begin
      if OpenMutex(MUTEX_ALL_ACCESS ,false , PChar(AMutexName)) = 0 then
      begin
        Result := True;
        CreateMutex(nil , true , PChar(AMutexName));
      end
      else Result := False;
    end;试试看....
      

  6.   

    没必要用互斥量,发消息需要用到句柄,所以直接用FindWindow防止重开即可。