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);
谢谢你的帮助!在你的博客里我学到了不少东西!
1.获取IDispatch接口(QueryInterface)
2.调用控件提供的函数,如(LoadMovie,Play)等函数。(可参看我的C调用COM组件的文章。)
那个Flash嵌入之后我要操作它的话要怎么做?