16
Nov
November 16, 2011 分类: ASM/C/C++     作者: hoverlees     留言: 4

ActiveX使用的头文件,是只有C++才能用的,C语言要使用ActiveX控件,也是件很容易的事。
微软标准的ActiveX控件,根本上它还是一个窗口(Window),通俗地说就是关联了一个或多个COM对象窗口。这个窗口当然可以通过CreateWindowEx函数创建。
大家都知道,CreateWindowEx要指定一个类名和窗口名,类名是通过RegisterClassEx注册的窗口类的类名,而窗口名则视情况,对于APPWINDOW类型的窗口来讲,窗口名就是窗口标题。很幸运的事,运行ActiveX控件的窗口的窗口类(也可以说是ActiveX控件宿主窗口),微软已经帮我们实现,只要调用ATL库(atl.dll)里的初始化函数AtlAxWinInit,即可实现注册,类名为”AtlAxWin”。类名有了,在CreateWindowEx的时候还要指定窗口名为ActiveX控件的CLSID,即可成功创建ActiveX宿主窗口。
要获得窗口里的COM对象,通过ATL库里函数AtlAxGetControl即可获得。其它的工作就是操作COM对象的工作了。

建议在C语言里用LoadLibrary加载atl.dll,然后再使用里面的这两个函数。

写了一个实现的代码段:

typedef BOOL (*_AtlAxWinInit)();
typedef void (*_AtlAxGetControl)(HWND h,IUnknown** ppv);

typedef struct _ATLAXLIB{
	HMODULE hMod;
	_AtlAxWinInit AtlAxWinInit;
	_AtlAxGetControl AtlAxGetControl;
}ATLAXLIB;

BOOL InitAtlaxLib(ATLAXLIB* lib){
	lib->hMod=LoadLibrary("atl.dll");
	if(lib->hMod==NULL) return 0;
	lib->AtlAxWinInit=(_AtlAxWinInit)GetProcAddress(lib->hMod,"AtlAxWinInit");
	lib->AtlAxGetControl=(_AtlAxGetControl)GetProcAddress(lib->hMod,"AtlAxGetControl");
	return 1;
}

调用示例,这是个创建shockwave flash控件的示例:
ATLAXLIB lib;
InitAtlaxLib(&lib);
lib->AtlAxWinInit();
CreateWindowEx(0,"AtlAxWin","{D27CDB6E-AE6D-11cf-96B8-444553540000}",WS_CHILD | WS_VISIBLE
			,0,0,400,400,hWnd,0,hInstance,0);
标签: ,
09
Sep
September 9, 2011 分类: ASM/C/C++     作者: hoverlees     留言: 16

COM(Component Object Model)是Windows里常用的组件对象模型,在Windows上是可以上升到操作系统级别,甚至到网络分布式级别的面象对象技术,也就是按照微软定义的标准实现的COM组件,不仅可以在本地Windows操作系统上让其它程序调用,而且可以供网络内的其它系统调用(DCOM)。

OLE是对象连接/嵌入技术,它其实就是COM,只是在COM的标准上主要增加了自动化功能,OLE大家最熟悉的应用就是在窗口程序上嵌入IE内核(WebBrowser类),然后程序通过WebBrowser提供的接口与里面的网页交互,然后就有了我们的遨游,360浏览器等等。而且OLE是脚本语言最重要的精神支持者之一

另外要指出的是COM是一种对象建模模型,任何人都可以使用这种模型为自己的项目建模,像腾讯的QQ软件,整个窗口上就嵌了一个OLE对象,但他们却又没有完全按照标准去写的,你无法拿到这个对象的包含的其它对象、属性和方法,这也是肯定的,要随便让人拿到那QQ软件就随便被其它程序控制了。

本文是以讲Windows上C语言访问COM为主的文章,并不打算讨论COM的实现细节,如果要了解COM的技术细节,可以参考微软的MSDN。文章后面附有我以前用汇编写的COM调用函数,我现在基本上不写汇编了,发上来是希望它能对汇编的学习人员提供帮助。

本文链接:
http://www.hoverlees.com/blog/?p=746


查看详细内容 »

快速链接
推荐标签
最新图片
较新文章
随机推荐
友情链接