如何由一个ocx控件窗口的句柄调用某个已经ID的接口函数 已经ocx控件窗口的句柄(HWND),如何在不使用MFC函数的情况下调用该控件的一个已经ID的接口函数。COM句柄接口函数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看了下,不知道是不是下面的用法添加头文件#include <atlbase.h>#include <atlwin.h>然后用CAxWindow吧,用QueryControl或者QueryHost获取接口 OCX算COM的一种,COM里面不是都有QueryInterface的嘛。就是满足这种要求的 貌似可行,能给个示例代码吗?我这个是写在dll中,注入到一个目标进程,hook了控件窗口的WNDPROC,如何通过控件窗口的HWND,调用指定ID的接口函数? CAxWindow Control(hWnd);然后查询到接口,如果有函数的接口函数ID,那可以用IDispatch的Invoke方式调用函数 有点找死的感觉,远程注入的DLL应该是在不同的线程吧,要知道绝大部分COM组件都是线程敏感的,无论你用什么方式获取到了接口指针,在跨线程时必须经过列集和散列才能正常调用,而列集过程必须在组件所属线程完成,散列过程在其它调用者线程中完成,直接把接口指针传递给其它线程会让你死得很难看。解决办法还是有的,但是要靠运气:1、如果这个组件在GIT(全局接口表)中注册过自己的接口,事情就很简单了,直接从调用线程中获取接口,可以正常调用。问题是哪个组件没事会注册GIT呢?2、HOOK窗口过程,在窗口过程中执行列集代码(窗口过程可以保证是在组件所在线程中执行),然后在调用线程中散列出接口。 难!你首先必须获得你期望的接口的指针(IKnown*),只知道接口ID是没有用的 是的,关键就是得到IUnknown* 这种方式好像不行。内部需要调用到AtlAxGetControl,AtlAxGetControl通过向Hwnd发送消息WM_ATLGETCONTROL来获取IUnknown接口指针,这就意味着控件必须为ATL控件或处理WM_ATLGETCONTROL消息,如果没处理此消息,就不能获取到。 VC手工复制文字到剪切板,GlobalUnLock未声明!!!!!!!!!!! 图像特效处理错误,急!!! 绘制菜单位图标记的问题[加急] 求救!!!!! 大家谁有在VC++下开发爬虫的经验,如何取得页面的内容 新手,不知道怎么把VC里CString改成C++里可用的 CListView 按上下箭头键时如何获得光标所在行? 关于dll、lib的问题。【快过年了,在猴年尾巴上再解决几个问题!】 怎样删除类,改变类的名字? 请教各位大侠。。。 vs2010解决方案出问题,求大神解答 CString和DWORD_PTR类型转换问题
添加头文件
#include <atlbase.h>
#include <atlwin.h>然后用CAxWindow吧,用QueryControl或者QueryHost获取接口
就是满足这种要求的
貌似可行,能给个示例代码吗?我这个是写在dll中,注入到一个目标进程,hook了控件窗口的WNDPROC,如何通过控件窗口的HWND,调用指定ID的接口函数?
然后查询到接口,如果有函数的接口函数ID,那可以用IDispatch的Invoke方式调用函数
1、如果这个组件在GIT(全局接口表)中注册过自己的接口,事情就很简单了,直接从调用线程中获取接口,可以正常调用。问题是哪个组件没事会注册GIT呢?
2、HOOK窗口过程,在窗口过程中执行列集代码(窗口过程可以保证是在组件所在线程中执行),然后在调用线程中散列出接口。
是的,关键就是得到IUnknown*
这种方式好像不行。内部需要调用到AtlAxGetControl,AtlAxGetControl通过向Hwnd发送消息WM_ATLGETCONTROL来获取IUnknown接口指针,这就意味着控件必须为ATL控件或处理WM_ATLGETCONTROL消息,如果没处理此消息,就不能获取到。