摘自这篇文章(点我),稍加整理。
一、COM组件的编写(使用MFC)
假设使用的是Visual studio 2008
首先要创建一个MFC DLL工程。在工程中添加“MFC类”,在“MFC类向导”中,“基类”选择“CCmdTarget”,“自动化”选中中一定要选择“可按类型创建”,比如填入“TestCom.HelloWorld”,这样就生成了HelloWorld.cpp和HelloWorld.h(假如类名取为HelloWorld的话)。
打开IDE“视图”“类视图”,找到TextActiveX下的IHelloWorld接口,右键“添加”,可选添加方法和属性。添加方法(比如sayHello)时,需要设置“返回类型”,方法名,以及此方法的参数(假如设置了BSTR的visitor)。至于类型BSTR,BSTR*,IDISPATCH这些需要另外再去研究... 因为MFC封装的缘故,生成的HelloWord类的成员函数sayHello的参数为LPCTSTR(即在UNICODE条件编译下的const wchar_t*及多字节下的const char*)类型。最后只要在sayHello函数中编写代码即可。最后的函数看起像:
- BSTR HelloWorld::sayHello(LPCTSTR visitor)
- {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CString strResult;
- strResult.Format(TEXT("你好啊,%s!"), visitor);
- MessageBox(0, strResult.GetBuffer(), TEXT("TestCom.HelloWorld.sayHello"), 0);
- return strResult.AllocSysString();
- }
如此一来,TestCom.HelloWorld就有了一个名为sayHello的函数可用了。
二、COM组件的调用(用C#测试)
以下所有调用方法都需要注册控件:使用regsvr32 TestCom.dll注册组件(其实就是调用了TestCom.dll中导出的函数DllRegisterServer)。
假设使用的是Visual studio 2008
在C#工程左边“解决方案管理器”中“引用”上右键“添加引用”,在对话框中选择“COM”项,找到TestCom(除非未注册控件,否则一定存在)项。调用代码如下:
- private void button1_Click(object sender, EventArgs e){
- try {
- HelloWorldClass helloObj = new HelloWorldClass();
- helloObj.sayHello("walker");
- } catch{
- MessageBox.Show("Error!");
- }
- }
编译后,除主程序外,会生成一个Interop.TestCom.dll必须和主程序一同发布。若编译不能正常通过,尝试更改编译配置为x86。另外,在主程序的Program.cs的Main函数中,最好加一层try保护,以在控件未注册的时候程序崩溃得友好一些。
- static void Main(){
- try {
- //Application....省略
- }catch{
- MessageBox.Show("请行注册控件TestCom.dll!", "程序崩溃了!",
- MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- }
- }
***
本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1183650如需转载请自行联系原作者
RQSLT