-
c语言入门之用C++Builder写COM版的Hello world
前几日用 OICQ 联系上一位快有两年不见的朋友,闲聊中得知他在用 BCB 做 COM ,碰上一些麻烦,我便自告奋勇要教他,刚讲了没几句便被同事拉去吃饭,便和朋友约好发 e-Mail 给他。第二天我便开始做一个 COM 版的 Hello world! ,仗着用 Delphi 写过几个简单的 COM ,以为用 BCB 也差不多,给果碰到不少问题(幸好没有当时教他,不然一定出丑)。弄了半天才成功,于是把那个发给他的 Mail 整理了一下贴到这里来。
开始本来想写个 EXE 的(即 Out of process 的) COM object ,但发现很多 COM 做成 EXE 都有问题,而我又不知道我那朋友熟不熟 DLL (即 In process ),而且 DLL 又不好调试,只好改为 EXE 型的 Automation ,这是最容易的 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 <vcl/ComObj.hpp>
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 就退出了。
这就是COM,有意思吧。用 BCB+ATL 写 COM 就是这么简单。
开始本来想写个 EXE 的(即 Out of process 的) COM object ,但发现很多 COM 做成 EXE 都有问题,而我又不知道我那朋友熟不熟 DLL (即 In process ),而且 DLL 又不好调试,只好改为 EXE 型的 Automation ,这是最容易的 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 <vcl/ComObj.hpp>
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 就退出了。
这就是COM,有意思吧。用 BCB+ATL 写 COM 就是这么简单。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式