已经ocx控件窗口的句柄(HWND),如何在不使用MFC函数的情况下调用该控件的一个已经ID的接口函数。COM句柄接口函数

解决方案 »

  1.   

    看了下,不知道是不是下面的用法
    添加头文件
    #include <atlbase.h>
    #include <atlwin.h>然后用CAxWindow吧,用QueryControl或者QueryHost获取接口
      

  2.   

    OCX算COM的一种,COM里面不是都有QueryInterface的嘛。
    就是满足这种要求的
      

  3.   


    貌似可行,能给个示例代码吗?我这个是写在dll中,注入到一个目标进程,hook了控件窗口的WNDPROC,如何通过控件窗口的HWND,调用指定ID的接口函数?
      

  4.   

    CAxWindow Control(hWnd);
    然后查询到接口,如果有函数的接口函数ID,那可以用IDispatch的Invoke方式调用函数
      

  5.   

    有点找死的感觉,远程注入的DLL应该是在不同的线程吧,要知道绝大部分COM组件都是线程敏感的,无论你用什么方式获取到了接口指针,在跨线程时必须经过列集和散列才能正常调用,而列集过程必须在组件所属线程完成,散列过程在其它调用者线程中完成,直接把接口指针传递给其它线程会让你死得很难看。解决办法还是有的,但是要靠运气:
    1、如果这个组件在GIT(全局接口表)中注册过自己的接口,事情就很简单了,直接从调用线程中获取接口,可以正常调用。问题是哪个组件没事会注册GIT呢?
    2、HOOK窗口过程,在窗口过程中执行列集代码(窗口过程可以保证是在组件所在线程中执行),然后在调用线程中散列出接口。
      

  6.   

    难!你首先必须获得你期望的接口的指针(IKnown*),只知道接口ID是没有用的
      

  7.   


    是的,关键就是得到IUnknown*
      

  8.   


    这种方式好像不行。内部需要调用到AtlAxGetControl,AtlAxGetControl通过向Hwnd发送消息WM_ATLGETCONTROL来获取IUnknown接口指针,这就意味着控件必须为ATL控件或处理WM_ATLGETCONTROL消息,如果没处理此消息,就不能获取到。