[ 2006/01/13 09:56 | by turbozv ]
|
今天回来折腾到现在才差不多搞定,网上的资料确实不多,我是连蒙带猜才明白其中的门道。
我的目标是用VC C++ SDK使用机器上的ActiveX控件,当然你要说有MFC, ATL使用非常方便,可是我们现在需要一个Pure C++/SDK的实现。微软的MSDN查了等于白查,堆积如山的知识完全无法迅速掌握。
我因为之前用过MFC的自动导入ActiveX控件工具,所以我相信C++/SDK也一样可以自动生成封装好的接口类文件,不过就是我还没有发现而已。于是开始我漫长的寻找中,终于我找到 OLE/COM Object Viewer 这个VC自带的工具,打开里面的Type Libraries,里面全部是系统已经注册的ActiveX控件列表,我马上选择Shockwave Flash,双击查看,总于我找到了从Ocx/Dll生成IDL的办法。
IDL就是接口描述语言,有了这个就向成功迈了一步了,但是这个时候我对下一步怎么做依然毫无头绪。又在google上晃悠了一阵,看到一篇文章教你怎么用一个COM接口扩展Explorer,由于好奇,我打开了他说的一个系统头文件Program FilesMicrosoft Visual StudioVC98IncludeEXDISP.H,我的眼睛突然一亮!一方面是我看到EXDISP.IDL也在这里,这就意味着我的Flash.IDL也可以生成我要的Flash.H;另一方面我看到EXDISP.H中的注解 /* File created by MIDL compiler version 3.02.88 */。这下我笑了:)
于是注意力转到MIDL这个工具上来,/help以后的参数异常的多,经过反复测试,终于发现一个参数/header filename,赶紧一试,于是.h, .c全部生成出来了。 呵呵,剩下的事情就非常简单了。不用多非唇舌了。
用SDK做东西就是累一点,不过感觉挺爽的
我的目标是用VC C++ SDK使用机器上的ActiveX控件,当然你要说有MFC, ATL使用非常方便,可是我们现在需要一个Pure C++/SDK的实现。微软的MSDN查了等于白查,堆积如山的知识完全无法迅速掌握。
我因为之前用过MFC的自动导入ActiveX控件工具,所以我相信C++/SDK也一样可以自动生成封装好的接口类文件,不过就是我还没有发现而已。于是开始我漫长的寻找中,终于我找到 OLE/COM Object Viewer 这个VC自带的工具,打开里面的Type Libraries,里面全部是系统已经注册的ActiveX控件列表,我马上选择Shockwave Flash,双击查看,总于我找到了从Ocx/Dll生成IDL的办法。
IDL就是接口描述语言,有了这个就向成功迈了一步了,但是这个时候我对下一步怎么做依然毫无头绪。又在google上晃悠了一阵,看到一篇文章教你怎么用一个COM接口扩展Explorer,由于好奇,我打开了他说的一个系统头文件Program FilesMicrosoft Visual StudioVC98IncludeEXDISP.H,我的眼睛突然一亮!一方面是我看到EXDISP.IDL也在这里,这就意味着我的Flash.IDL也可以生成我要的Flash.H;另一方面我看到EXDISP.H中的注解 /* File created by MIDL compiler version 3.02.88 */。这下我笑了:)
于是注意力转到MIDL这个工具上来,/help以后的参数异常的多,经过反复测试,终于发现一个参数/header filename,赶紧一试,于是.h, .c全部生成出来了。 呵呵,剩下的事情就非常简单了。不用多非唇舌了。
用SDK做东西就是累一点,不过感觉挺爽的
.\msword.idl(15) : warning MIDL2015 : failed to load tlb in importlib: : VBE6EXT.OLB
.\msword.idl(17) : warning MIDL2015 : failed to load tlb in importlib: : MSO.DLL
.\msword.idl(739) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(851) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(887) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(926) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(962) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(976) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(1182) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(1194) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(1243) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(2039) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(2639) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(2883) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(3048) : error MIDL2003 : redefinition : emptyenum
.\msword.idl(3246) : error MIDL2025 : syntax error : expecting a type specification near "Application"
.\msword.idl(3246) : error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation
实在解决不了,望指教!
COM 还是用 C 写一次,理解才透彻
http://www.codeguru.com/Cpp/I-N/ieprogram/article.php/c4379/
How to add ATL control containment support to any window in Visual C++
Non-MFC Application. If you are adding control containment to a non-MFC application, see Control Containers in Chapter 19 of Adam Denning's book OLE Controls Inside Out (Microsoft Press 1995).