小弟用VC调用一个DELPHI做的OCX控件,发现其在OCX中定义的事件没有触发。高人指点是MFC不支持多线程触发OCX事件,所以想在OCX控件本身做一些修改,改在通过发送消息的方式来启动事件。但是如何在ActionX Form中实现这一点呢?请各位大大指点一下源码大概如下:
const EventMessage = WM_USER + 100;
TAppServerThread = class(TThread)
  public
    constructor Create();
    procedure   Execute; override;
    procedure   Terminate;
  end;
type
  TClientX = class(TActiveForm, IClientX)
  private
    { Private declarations }
    FEvents: IClientXEvents;
    procedure OnReceiveInfo();
  public
    { Public declarations }
    procedure Initialize; override;
    procedure GetWinMessage(var Msg:TMessage);message EventMessage;  //处理消息的函数
  end;在线程执行体中
procedure TAppServerThread.synchAddDataToControl;
var
ThisWnd:THandle;
begin
ThisWnd := FindWindow(nil, 'ClientX');
if (ThisWnd<>0) then                     //此处ThisWnd确实不为0
      PostMessage(ThisWnd, EventMessage, 0, 0);
end;procedure TClientX.GetWinMessage(var Msg:TMessage);
begin
  if FEvents <> nil then  FEvents.OnReceiveInfo();       //没有进入此函数体
end;调试中发现,消息发送后就无了任何响应.
分还可以加啊,只求能解决这个问题

解决方案 »

  1.   

    FEvents 有没有赋值,没有贴出set fevents 的方法
      

  2.   

    楼上指的是这个吗?
    procedure TClientX.EventSinkChanged(const EventSink: IUnknown);
    begin
      FEvents := EventSink as ISMSClientXEvents;
      inherited EventSinkChanged(EventSink);
    end;
      

  3.   

    procedure TAppServerThread.synchAddDataToControl;
    var
    ThisWnd:THandle;
    begin
    ThisWnd := FindWindow(nil, 'ClientX');
    if (ThisWnd<>0) then                     //此处ThisWnd确实不为0
          PostMessage(ThisWnd, EventMessage, 0, 0);
    end;Thiswnd 是TAppServerThread的句柄不是TClientX的句柄 不能用TClientX的方法截取
    要用復盖TAppServerThread的wndPRoc方法处理。
      

  4.   

    把 GetWinMessage(var Msg:TMessage);message EventMessage;  //处理消息的函数 
    的方法放入TAppServerThread 
     类中,或者在Activeform中调用TAppServerThread 的方法synchAddDataToControl
    Activeform 为Tfrmact 
     则復盖 Tfrmact 的 wndproc 的方法
     
    procedure WndProc(var Message: TMessage);override
    var tmpclass:TClientX ;
    begin 
        if message = EventMessage then
       begin 
         tmpclass := TClientX.create(..) ;
         TClientX(tmpclass).FEvents.OnReceiveInfo();        
        end;  inherited;
       
    end;
     
     在wndproc中处理,要把消息的事件也传递过来
     
      

  5.   

    还是没有进入消息处理函数里。
    不知道是不是我理解错误了chludlf的代码,线程类是没有WndProc函数的。我是直接写另一个处理函数,然后指认到TClientX的WndProc去
      

  6.   

    另外,如果是要在线程里的处理方法中创建一个TClientX的实例,
     tmpclass := TClientX.create(..) ;
     TClientX(tmpclass).FEvents.OnReceiveInfo();        
    程序直接就退出了。
      

  7.   

    TClientX(tmpclass).FEvents.OnReceiveInfo();        不能直接调用,我是给你举的例子
    是说TClientX要把事件传给wndproc执行,这是在delphi中用处理的,你post 的消息不在TClientX类中不能由TClientX类的接收消息函数处理,只能由post消息的
    TAppServerThread类或父类处理,如果都没有处理向上追踪,一直追到windows 的消息处理机制,