摘自这篇文章(点我),稍加整理。

    一、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函数中编写代码即可。最后的函数看起像:

  1. BSTR HelloWorld::sayHello(LPCTSTR visitor) 
  2.     AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
  3.     CString strResult; 
  4.     strResult.Format(TEXT("你好啊,%s!"), visitor); 
  5.     MessageBox(0, strResult.GetBuffer(), TEXT("TestCom.HelloWorld.sayHello"), 0); 
  6.     return strResult.AllocSysString(); 
    如此一来,TestCom.HelloWorld就有了一个名为sayHello的函数可用了。
 
二、COM组件的调用(用C#测试)
   以下所有调用方法都需要注册控件:使用regsvr32 TestCom.dll注册组件(其实就是调用了TestCom.dll中导出的函数DllRegisterServer)。 
    假设使用的是Visual studio 2008
   在C#工程左边“解决方案管理器”中“引用”上右键“添加引用”,在对话框中选择“COM”项,找到TestCom(除非未注册控件,否则一定存在)项。调用代码如下:
  1. private void button1_Click(object sender, EventArgs e){ 
  2.     try  { 
  3.     HelloWorldClass helloObj = new HelloWorldClass(); 
  4.     helloObj.sayHello("walker"); 
  5.     }  catch
  6.     MessageBox.Show("Error!"); 
  7.     } 
    编译后,除主程序外,会生成一个Interop.TestCom.dll必须和主程序一同发布。若编译不能正常通过,尝试更改编译配置为x86。另外,在主程序的Program.cs的Main函数中,最好加一层try保护,以在控件未注册的时候程序崩溃得友好一些。
  1. static void Main(){ 
  2.     try { 
  3.     //Application....省略 
  4.     }catch
  5.     MessageBox.Show("请行注册控件TestCom.dll!""程序崩溃了!",  
  6.                   MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
  7.     } 
 
 
***