C++ COM 开发 Hello World V2

本文介绍了COM技术的历史及其与ATL的关系,并通过一个示例程序详细展示了COM接口的设计原则和实现方法。文章强调了COM组件的语言无关性、动态链接能力和接口设计的重要性。
COM的历史与ATL

下面的示例程序来自:《COM+技术内幕》

所得:

组件的目标:
  • 语言无关(发布的时候必须是二进制的,编译链接好的),这样才能在市场中存活下来,使得语言的流行不会冲击应用程序。
  • 升级不影响客户的正常使用
  • 远程组件与位置无关,必须像本地组件一样使用
  • 新老版本兼容:

组件的需求:
  • 动态链接:如果不能动态链接,就无法升级,就不能在用户使用的过程中将程序替换掉。
  • 信息封装:只要接口不变化,双方组件发生了变化都不会影响对方。反之,只要接口变了,另一方为了适应必须要做出被动的调整。

接口的设计:
  • 接口的设计者要有预测未来的能力,这对大多数人来说都是很困难的。

各种接口:
  • DLL接口:导出函数
  • C++接口:抽象基类的成员函数,变为COM接口需要继承IUnknown接口
  • COM接口:接口就是一切

interface接口:
interface接口在ObjBase.h中被定义如下:
#define __STRUCT__ struct
#define interface __STRUCT__


com开发示例程序

主要为了展示最基本的com开发示例程序,略见一斑。

工程百度云下载:http://pan.baidu.com/s/1qYSrXtM

源代码:

#include <iostream>
using namespace std;
#include <ObjBase.h>

void trace(const char* pMsg)
{
	cout<< pMsg<<endl;
}

interface IX
{
	virtual void __stdcall Fx1(void) = 0;
	virtual void __stdcall Fx2(void) = 0;
};

interface IY
{
	virtual void __stdcall Fy1(void) = 0;
	virtual void __stdcall Fy2(void) = 0;
};

class CA : public IX , public IY
{
public:
	virtual void __stdcall Fx1() { cout<<"CA::Fx1()"<<endl;}
	virtual void __stdcall Fx2() { cout<<"CA::Fx2()"<<endl;}
	virtual void __stdcall Fy1() { cout<<"CA::Fy1()"<<endl;}
	virtual void __stdcall Fy2() { cout<<"CA::Fy2()"<<endl;}

};

int main()
{
	trace("client: create an instance of the component.");
	CA* pA = new CA;

	trace("client: use the IX interface.");
	IX* pIX = pA;
	pIX->Fx1();
	pIX->Fx2();

	trace("client: use the IY interface.");
	IY* pIY = pA;
	pIY->Fy1();
	pIY->Fy2();

	trace("client: delete the component.");
	delete pA;
}

输出:


### 如何在 Linux 中打印 HelloWorld 要在 Linux 环境下实现 `Hello World` 的输出,可以根据不同的需求选择合适的方式。以下是几种常见的方法及其具体实现。 #### 方法一:通过 C/C++ 编程语言实现 使用 C 或 C++ 编写一个简单的程序来输出 `Hello World` 是最常见的入门方式之一。以下是一个完整的 C 实现: ```c // helloworld.c 文件内容 #include <stdio.h> int main() { printf("Hello World!\n"); return 0; } ``` 保存上述代码到名为 `helloworld.c` 的文件中。接着,在终端中运行以下命令进行编译并执行: ```bash gcc -o helloworld helloworld.c # 使用 GCC 编译器生成可执行文件 ./helloworld # 执行生成的可执行文件 ``` 这将显示如下输出: ``` Hello World! ``` 此过程依赖于系统中的 GCC 编译器工具链[^4]。 --- #### 方法二:通过 Shell 脚本实现 Shell 脚本是一种轻量级的方法,适合快速测试或脚本化操作。创建一个名为 `helloworld.sh` 的文件,并加入以下内容: ```bash #!/bin/bash echo "Hello World!" ``` 赋予脚本执行权限并通过以下命令运行它: ```bash chmod +x helloworld.sh # 添加执行权限 ./helloworld.sh # 运行脚本 ``` 这同样会输出 `Hello World!` 到控制台[^5]。 --- #### 方法三:通过 Python 实现 Python 提供了一种简单而直观的方式来输出字符串。只需打开终端并键入以下命令即可立即看到效果: ```python python3 -c 'print("Hello World!")' ``` 或者,也可以编写一个独立的 `.py` 文件(如 `helloworld.py`),其内容为: ```python # helloworld.py 文件内容 print("Hello World!") ``` 随后运行该文件: ```bash python3 helloworld.py ``` 以上两种方法均能成功输出 `Hello World!`。 --- #### 方法四:通过 Linux 内核模块 (Kernel Module) 输出 对于更高级的需求,比如学习 Linux 内核开发,可以利用内核模块技术实现在加载和卸载模块时分别打印消息的功能。以下是一段典型的内核模块代码示例: ```c // hello_module.c 文件内容 #include <linux/module.h> #include <linux/kernel.h> static int __init hello_init(void) { printk(KERN_EMERG "Hello World from kernel space!\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_EMERG "Goodbye from kernel space!\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple Hello World Kernel Module"); ``` 构建和加载模块的过程较为复杂,需遵循特定流程,包括配置 Makefile 和调用 `insmod/rmmod` 命令等[^1]。 --- #### 总结 无论采用哪种方法,都可以轻松地在 Linux 下实现 `Hello World` 的功能展示。每种方案适用于不同场景和技术背景的学习者。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值