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);