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);
标签: ,
访客留言[谢谢!]
Linex
谢谢你的帮助!在你的博客里我学到了不少东西!
2013-04-11 18:57:21
C语言梆定ActiveX事件 | Hoverlees' Blog
[...] C语言使用ActiveX控件 [...]
2014-03-16 22:09:13
Linex
那个Flash嵌入之后我要操作它的话要怎么做?
2013-03-31 01:43:17
hoverlees
1.获取IDispatch接口(QueryInterface) 2.调用控件提供的函数,如(LoadMovie,Play)等函数。(可参看我的C调用COM组件的文章。)
2013-03-31 21:59:44
我来留个言

您的电子邮箱我一定会保密的哦!

昵称

邮箱

评论内容