C++ COM写一个DLL
来源:互联网 发布:梅州天勤网络 编辑:程序博客网 时间:2024/05/16 07:51
COM是一种接口技术,它提供了一种方法用于客户程序进行调用。COM原理和技术的文章已经很多了,就不过多讲解了,这里只注重实现。下面分几步对进程内COM组件进行编码实现以达到对实现一个COM的清晰的认识,目的是通过COM接口方法调用DLL中的函数。
首先,创建一个标准的win32 DLL项目mycom,dllmain入口实现如下:
- DWORD g_dwAttachedProcesses = 0L; // # of attached processes
- DWORD g_dwPageSize = 0L; // System page size
- HINSTANCE g_hInstance = 0L; // Instance Handle
- LONG g_cLock = 0L; // # of outstanding objects
- BOOL APIENTRY DllMain( HMODULE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- BOOL fRetVal = FALSE;
- SYSTEM_INFO SystemInformation;
- switch(ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- // Assume successfully initialized
- fRetVal = TRUE;
- // Do one-time initialization when first process attaches
- if(!g_dwAttachedProcesses)
- {
- g_hInstance = (HINSTANCE)hModule;
- // Get the system page size
- if(!g_dwPageSize)
- {
- GetSystemInfo( &SystemInformation ); // can't fail
- g_dwPageSize = SystemInformation.dwPageSize;
- }
- }
- // Do per-process initialization here...
- // Remember that another process successfully attached
- g_dwAttachedProcesses++;
- break;
- case DLL_THREAD_ATTACH:
- // Clean up when the last process is going away
- if(g_dwAttachedProcesses == 1)
- {
- }
- // Do per-process clean up here...
- // Remember that a process has detached
- g_dwAttachedProcesses--;
- break;
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return fRetVal;
- }
在工程中添加没有mycom.DEF文件用于导出COM接口函数,如下:
- LIBRARY "mycom"
- EXPORTS
- ; EntryName [=InternalName] [@Ordinal] [NONAME] [CONSTANT]
- ; This is the entry point that DllMainCRTStartup calls
- DllMain @12
- ; Standard OLE exports
- DllGetClassObject PRIVATE
- DllCanUnloadNow PRIVATE
- ; For self-registration.
- DllRegisterServer PRIVATE
- DllUnregisterServer PRIVATE
DllMain 函数可以不导出。
其次,在mycom.cpp中实现导出函数,如下:
- STDAPI DllUnregisterServer(void)
- {
- return S_OK;
- }
- STDAPI DllRegisterServer(void)
- {
- return S_OK;
- }
- STDAPI DllCanUnloadNow(void)
- {
- if(!g_cLock)
- return S_OK;
- return S_FALSE;
- }
- STDAPI DllGetClassObject(REFCLSID rclsid ,REFIID riid,void **ppv)
- {
- return CLASS_E_CLASSNOTAVAILABLE;
- }
通过以上步骤,一个基本的DLL创建完成,这还不能称之为COM,仅仅是一个DLL导出了几个空函数而已。
- C++ COM写一个DLL
- C++,DLL,COM,COM+概述
- Using Non-COM C DLL
- C++,DLL,COM,COM+概述[转]
- C++写一个COM组件
- 如何写DLL(C++)
- C++ COM实现之一 创建一个DLL
- C++ COM实现之一 创建一个DLL
- C++ COM实现之一 创建一个DLL
- C封装类写的一个DLL,所对应的接口为类的相应接口
- 如何用ATL写一个C++的COM组件(C#轻松调用C/C++接口)
- 写Dll时遇到的一个错误
- 想写一个枚举硬盘分区的dll
- filter是依照com模式写的dll
- C#调用PB写的com组件dll
- C#调用PB写的com组件dll
- C#调用PB写的com组件dll
- 用MFC写一个COM组件
- BZOJ 1002([FJOI2007]轮状病毒-基尔霍夫矩阵)
- C#中的WebBrowser控件的使用
- Debian纯手动安装redis2.6.13,以及详细配置介绍,个人实战版
- 拷贝构造函数 访问私有变量成员
- adb shell am 的功能
- C++ COM写一个DLL
- linux 下设置 git 使用 http/https 代理(goagent)
- C#中禁止Winform窗体关闭
- HTTP协议复习总结
- discuz不修改代码达到允许referer到同顶级域名的方案
- Java之美[从菜鸟到高手演变]之HashMap、HashTable
- CSS3 圆角(border-radius)详解
- 设计模式 -- Singleton单态模式
- Linux rename命令 举例解析