大家好!我的要求是一个程序一个实例运行.当我检测出有一个实例存在之后我要调用这个实例里的某些函数.请问这怎么才能调到.谢谢.
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.   

    procedure TForm1.BitBtn3Click(Sender: TObject);
    var
      MyCom : IP_FHC_Com;
    begin
      MyCom := CreateComObject(FHC_Com_TLB.CLASS_P_FHC_Com) as IP_FHC_Com;
      MyCom.SendDataToPush_Future('AA49964', '0368519',0,'2330',0,1,53.4);
    end;
    參照一下
      

  2.   

    是可以调用呀.但是那样调用不是这个已经存在的实例的呀.你调用的这个函数怎么去操作已经存在的这个实例窗体呀.就比如说这个程序是MDI窗体的.我发现存在这个实例之后我要求已经存在这个实例去创建个子窗体.有什么不清楚的吗???
      

  3.   

    此贴
    http://topic.csdn.net/u/20081007/10/607d9d37-4cf2-4f21-b64a-8cd621bcbb8f.html第4楼已回复。
    没必要重复发贴,如果是为了多给分表示对问题的重视,完全可以用一个贴子来提问后加分即可。
      

  4.   

    自定义一个message消息,做message响应,然后用sendmessage即可通知.
    handle可以通过findwindow等方法获取.
      

  5.   

    兄弟你猜對了,‘導’分,呵呵,我那個代碼是調用COM組件的
    沒具體看樓主意思
      

  6.   

    这个问题我具体回答下吧。首先要在以下处添加代码:
        //发现已经有实例创建,我怎么去调用它的一些函数呢?比如说我要调用这个实例的函数写在主窗体单元里.谢谢
        BSMRecipients := BSM_APPLICATIONS; //BSMRecipients: DWORD;
        BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients,
                UMI_USERMESSAGE, 0, 0); //UMI_USERMESSAGE是一个自定义消息,不明白可以查看自定义消息相关资料;
    然后在主窗体处添加代码:
    const
      WM_WIS_FOUNDSERIAL = 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));
    这样就能实现楼主的意愿。唯一一点就是如果想把已经创建的实例设置到前台,还需要其他处理。
      

  7.   

    错了个地方,
    WM_WIS_FOUNDSERIAL = WM_USER + $0101;
    改成
    UMI_USERMESSAGE = WM_USER + $0101;