用C Builder写COM版的Helloworld

文章作者 100test 发表时间 2007:09:06 12:48:05
来源 100Test.Com百考试题网


  开始做 Automation :
  1.File|New Application (做 Automation 要有 Form ,即使是个空的也不要拿掉).
  2.File|New... 选 ActiveX 页上的 Automation Object. 在对话框中输入 COM 名: AutoTest ,其它就用默认值。
  3.在打开的 Type Library Editor (就是那个标题为 Project1.tlb 东东)中,左边的树中的 IAutoTest 上点右键, New 一个 Property ,会产生两个同名的东东,分别用于 Get 和 Set ,取名为 Hello (两个会自动变为一样的),然后在右边找到 Parameters 页,将 Type 改为 BSTR(Set) 和 BSTR *(Get ,注意,列表中的 BSTR 没有*,要自已输入一个)。
  4.然后点顶上那个 Refresh Implementation 的按钮(按钮上的小图片是一张纸,里面有两个绿色的箭头成环绕状),这一步很重要,每次修改完 TLB 文件都要点这个按钮再存盘,它将产生相应的代码。
  5.在 AutoTestImpl.h 文件中找到如下内容:

  // IAutoTest
  public:

  STDMETHOD(get_Hello(BSTR* Value)).
  STDMETHOD(set_Hello(BSTR Value)).

  这是 Refresh Implementation 时自动产生的代码,在后面加上:
  private :
  WideString FData.

  Type Library Editor 产生的 CPP/H 文件除了这个以 Impl (即 Implementation )结尾的以外,还有两个,分别是以 _ATL 和 _TLB 结尾的: _ATL 是自动产生的,通常不用变它,当然如果你有特别的要求并且你对 ATL 又很熟,也可以改改它; _TLB 是由 Type Library Editor 自动维护,无须修改,改了也没用,你的任何修改都会在 Refresh Implementation 时被改回来的。
再看 AutoTestImpl.cpp 文件,找到如下内容:
  STDMETHODIMP TAutoTestImpl::get_Hello(BSTR* Value)
  {
  try
  {

  }
  catch(Exception &.e)
  {
  return Error(e.Message.c_str(), IID_IAutoTest).
  }
  return S_OK.
  }.

  这也是自动产生的东东,在这个 try 中输入:
  try
  {
  *Value = FData. // 加在这里
  }

  在 Set 的 Try 中输入:
  FData = Value.

  注意一定要用 try..catch 括起来,否则..。 Delphi 就不用,这没办法,因为 BCB 是用 ATL 的嘛,而 Delphi 是用 Borland 自已搞的 DAX(Delphi ActiveX Extension) , BCB 就是在这点上和 Delphi 有很大不同。
  6.Save All ,编译。
  7.在命令行下运行:
  Project1 /regserver

  注册这个 COM ,注销则用:
  Project1 /unregserver

  记得删除 COM 之前一定要先注销,不然你只好到注册表里慢慢找了。

  使用 Automation (前期联编用法):
  1.File|New Application
  2.在 Project2 中加入 Project1_TLB.CPP
  3.在 Unit2.h 中加入:

  #include "Project1_TLB.h"

  和:
  private: // User declarations
  TCOMIAutoTest MyTest. // 加入的

  4.在 Form 上放一个 Label 和一个 Button 。双击BUTTON,在事件响应中输入:
  try {
  if ( !MyTest )
  {
  MyTest = CoAutoTest::Create( ).
  MyTest.Hello = WideString( "Hello world!" ).
  }
  Label1->Caption = MyTest.Hello.
  }
  catch ( EOleSysError &.e )
  {
  ShowMessage( e.Message ).
  }

  5.Save All ,编译。
  6.运行后,点 Button ,你会看到 Project1 也运行起来,同时 Label1 显示 "Hello world!" 。
  当 Project2 退出时, Project1 也自动退出。会了吧。

  另一种使用 Automation 的方法(后期联编用法):
  1.File|New Application
  2.在Unit3.cpp中加入:

  #include

  3.在 Form 上放一个 Label 和一个 Button 。双击BUTTON,在事件响应中输入:
  Variant v = CreateOleObject( "Project1.AutoTest" ).
  v.Exec( PropertySet( "Hello" ) << "Hello world!" ).
  Label1->Caption = v.Exec( PropertyGet( "Hello" ) ).
 
  4.Save All ,编译。
  5.运行后,点 Button ,你会看到 Project1 也运行起来,同时 Label1 显示 "Hello world!" ,然后 Project1 就退出了。


相关文章


从TColor对象中解析出红、绿、蓝的亮度
个性凸现的动画特技效果
关于文件复制的程序代码
关于捕获VCL没有处理的Windows消息
用C Builder写COM版的Helloworld
类似网络蚂蚁的悬浮窗体
三层架构各层间的访问过程
用C 制作具有HTML风格的动态按钮
数字小键盘指法练习
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛