• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > com应用偏门—在内存中动态创建COM组件

com应用偏门—在内存中动态创建COM组件

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了com组件,com组件是什么,com组件下载,com组件注册,com组件编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: com应用偏门—在内存中动态创建COM组件
描述:


作者联系方式:
email:         libodeng@gmail.com
msn:           libodeng@gmail.com
更多文章请访问本人blog  http://libo.deng.blog.163.com
引子
对于包含大量COM组件的程序,在处理版本变更,升级,卸载时往往容易遇到各种各样的问题,这里基于ATL给出了一种在内存中直接加载COM的实现,这种方式不需要组件预先在操作系统进行注册(即载即用),特别适合那些需要直接动态创建COM的场合。
 
实现
对ATL组件端,需要提供一个动态创建的入口函数,实际上只需要增加一小行代码,然后把COM创建过程直接委托给ATL实现:
 
//直接创建入口点
STDAPI DllCreateObject(REFIID riid, LPVOID* ppv)
{
         CComPtr<IClassFactory> pFactory; 
HRESULT hr = _Module.GetClassObject(CLSID_Control/*你的组件CLSID*/, IID_IClassFactory, (void**)&pFactory);
         if (hr == S_OK)
                  hr = pFactory->CreateInstance(0, riid, ppv);
         return hr;
}
如果有必要,你也可以去掉四个标准导出函数
STDAPI DllCanUnloadNow(void)
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
STDAPI DllRegisterServer(void)
STDAPI DllUnregisterServer(void)
 
 
在COM调用端,只要装载包含COM的DLL,调用刚才增加的入口函数即可
typedef HRESULT (WINAPI* DLLCREATEOBJECTFUNC) (REFIID riid, LPVOID* ppv);
CreateComObject(LPCTSTR lpszModuleFile, const IID &riid, void **ppv)
{
            *ppv = NULL;
            
            HMODULE hDLL = LoadLibrary(lpszModuleFile);
            TCHAR msg[512];
 
            if (hDLL == NULL)
            {
                        wsprintf(msg, _T("未找到动态链接库文件:%s!请确认该文件已经存在!"),lpszModuleFile);
                        ::MessageBox(NULL, msg, _T("Error"), MB_OK | MB_ICONERROR);
                       return;
            }
 
            DLLCREATEOBJECTFUNC pFunc = (DLLCREATEOBJECTFUNC)GetProcAddress(hDLL, "DllCreateObject");
            if (pFunc == NULL)
            {
                        wsprintf(msg, _T("在库文件%s中未找到入口函数 DllCreateObject!"),lpszModuleFile);
                        ::MessageBox(NULL, msg, _T("Error"), MB_OK | MB_ICONERROR);
                        FreeLibrary(hDLL);    
                       return;
            }
 
            HRESULT hr = (*pFunc)(riid, ppv);
 
            if (hr != S_OK || *ppv == NULL)
            {
                        FreeLibrary(hDLL);
                        wsprintf(msg, _T("调用DllCreateObject创建对象错误! (%s)"),lpszModuleFile);
                        ::MessageBox(NULL, msg, _T("Error"), MB_OK | MB_ICONERROR);
            }
}
欢迎访问全球最不受欢迎的技术blog 
http://libo.deng.blog.163.com


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • COM组件的变量问题?
  • DLL中对进程外的ActiveX/COM组件(EXE形式)的对象实例化问题,DLL内不支持调进程外COM??
  • 怎样将原来不支持COM的mfc类,成为com类
  • MFC实现COM的接口映射的问题。请教高手。急。。
  • COM+组件的注册问题?
  • 关于COM组件的问题
  • com组件全局变量问题
  • COM组件和主程序之间的数据传输问题??
  • MFC中添加服务器组件的注册问题。
  • Com组件使用Recordset的游标问题

相关文章

  • 2017-06-05 如何将dll编译到ocx中
  • 2017-06-05 从COM接口的函数如何取得结构体和结构体数组?
  • 2017-06-05 一些简单的线程问题
  • 2017-06-05 如何注册COM组件
  • 2017-06-04 关于外部控件的问题?
  • 2017-06-05 请问一下vs2008的mfc使用ocx问题
  • 2017-06-04 我想实现不要头文件使用com组件
  • 2017-06-05 是不是DLL里面不支持C++异常,但支持MFC宏异常
  • 2017-06-04 mschart作图问题
  • 2017-06-05 如何利用ActiveX控件获取当前页面的URL?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 问一个入门级的问题关于WaitForSingleObject的
    • COM+组件服务器出错了,求助
    • 类与类之间怎么传递消息?急急急!!!
    • 有关多线程问题的提问,请各位高手指教
    • 很初级的问题,忘指教
    • 64位ocx能在xp32位系统上注册吗,反过来,会怎样?
    • 运行cab的问题。
    • VC60中如何实现浏览器中不良网址的添加跟网页源代码的获取啊
    • dxshow能否控制扫描仪和数码相机
    • 在VC中如何设置全局变量?关于线程向程序传输数据

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有