ATL创建进程外COM组件服务(C++图解说明)

1 篇文章 0 订阅
1 篇文章 0 订阅

作者:HH

时间:2019-01-08

参考文献:

【1】https://blog.csdn.net/mergerly/article/details/8643472

【2】https://www.cnblogs.com/DeeLMind/p/7809115.html

===============================================================================================

关于COM技术的具体原理、技术细节及优缺点,大家可以直接百度获取,这里我将通过大量截图以向导的方式向大家特别是初学者介绍一下COM组件服务的创建过程及如何用客户端去调用该组件提供的服务。当然本文不排除有很多错误和遗漏,如果有热心朋友发现错误,请及时联系我,我将第一时间修改,降低自己的失误对大家的不利影响。

主要内容:

1)创建进程外COM组件服务;

2)创建控制台客户端,对COM组件服务进行调用测试。

具体方法如下:

1.创建ATL的COM组件工程

1.1 添加COM简单对象

1.2 命名简单对象和程序ID

1.3 选择线程模型,默认为单元,我不太理解,估计应该与多例模式类似,客户端每创建一个实例系统会根据注册信息启动一个COM组件进程。单线程,应该是不管有多少个客户端调用该组件服务,系统只创建一个COM服务组件进程,当所有客户端退出并释放资源和反初始化后,COM组件服务进程退出。

两者区别如下图:

1.4 添加方法,在类视图中,给接口添加方法

1.5 实现方法

2. 注册

2.1 重载PreMessageLoop和ParseCommandLine,后面我们通过批处理或cmd命令行,传注册命令时,系统会回调这个两个函数并向系统注册COM信息【其实不重载也可以】

2.2 让DCOM发现刚刚创建的COM组件

3. 注册进程外COM组件服务,创建下图所示的批处理文件并以管理员方式运行

3.1 查看COM组件,WIN+R中输入dcomcnfg,弹出组件服务对话框,找到DCOM配置

3.2 注册表查看,win+regedit  找到HKEY_CLASSES_ROOT,按CTRL+F,输入ATLCOMProject,查到之后可按F3向下查询

注册的目的就是让操作系统知道我们的COM组件在哪里,它的基本信息是什么,当客户端访问请求时,操作系统直接根据注册信息直接找到COM组件并启动起来;好比我们开公司一样,我们需要先到国家登记处,将公司的一些必要信息告诉登记部门,如:公司在哪里,可以干什么,你只有登记过了,才是合法的,才有资格去享受国家的资源,否则你就是黑户,外面客户就没法正常去买你所提供的服务。

4. 创建win32控制台测试工程

在main函数中添加如下代码,注意:头文件需要添加刚刚COM组建编译成功之后生成的.h和.c文件,另外程序ID为之前创建ATL简单对象时,我们随便命名的程序id。具体代码如下图所示:

5. 测试

如果想要代码,可输入:ATL创建进程外COM组件服务(C++)来获取

 

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
使用 ATL 创建窗口可以遵循以下步骤: 1. 在 Visual Studio 中创建一个 ATL 项目。 2. 在 ATL 项目中,打开 `resource.h` 文件并添加新的资源 ID。 3. 在 ATL 项目中,打开 `MyWindow.h` 文件并添加以下代码: ```c++ class CMyWindow : public CWindowImpl<CMyWindow> { public: DECLARE_WND_CLASS(_T("MyWindowClass")) BEGIN_MSG_MAP(CMyWindow) MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() private: LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { return 0; } LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); EndPaint(&ps); return 0; } LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PostQuitMessage(0); return 0; } }; ``` 4. 在 ATL 项目中,打开 `MyWindow.cpp` 文件并添加以下代码: ```c++ #include "stdafx.h" #include "resource.h" #include "MyWindow.h" CMyWindow::CMyWindow() { } LRESULT CMyWindow::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // 创建窗口 Create(NULL, CRect(0, 0, 640, 480), _T("My Window"), WS_OVERLAPPEDWINDOW); return 0; } LRESULT CMyWindow::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); // 绘制图形 EndPaint(&ps); return 0; } LRESULT CMyWindow::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PostQuitMessage(0); return 0; } ``` 5. 在 ATL 项目中,打开 `stdafx.h` 文件并添加以下代码: ```c++ #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS #define _AFX_ALL_WARNINGS #include <afxwin.h> #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> ``` 6. 在 ATL 项目中,打开 `main.cpp` 文件并添加以下代码: ```c++ #include "stdafx.h" #include "MyWindow.h" CAppModule _Module; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { _Module.Init(NULL, hInstance); CMyWindow wnd; wnd.Create(NULL); wnd.ShowWindow(nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } _Module.Term(); return 0; } ``` 以上是使用 ATL 创建窗口的基本步骤,可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值