加载COM的方式

通常我们都是使用CoCreateInstance或CoGetClassObject获得接口,再通过接口访问他的成员方法。在C++支持下,从来不会有任何问题。但是如果使用Win32模式,纯粹C风格编程,就会出现问题了。

通过研究我发现其实上述访问方式本身就存在问题。标准的访问方式,如D3D一样,接口的初始化必须在Com提供的API基础上完成。COM设计者需要提供一个API,像DLL的导出函数一样,供给外部程序调用。

具体设计:

下面是一个gdi扩展函数库gdiex,GdiexCreate就是创建接口的一个函数,如同Direct3DCreate9一样,调用这个函数可以立刻创建一个接口指针。

在COM内部设计导出函数,如:

HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)
{
HRESULT hr;
ISaveDDCtl * pCtrl = NULL;

hr = CoCreateInstance( CLSID_SaveDDCtl, NULL, CLSCTX_SERVER, IID_ISaveDDCtl, (void**) &pCtrl);

if(FAILED(hr))
{
 MessageBox(NULL, "GdiexCreate Failed!", "gdiexPS", MB_OK|MB_ICONSTOP);
 return hr;
}

*lplpGdiex = (LPVOID) pCtrl;

return S_OK;
}

该函数可以放在主要cpp文件中。

在导出的头文件(gdiex.h)中作出声明:

HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex);

只要不重新生成COM,这个头文件中都会包含该API。

下来在gdiex.def增加这个API名字,以便外部访问。

EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObjectPRIVATE
DllRegisterServerPRIVATE
DllUnregisterServerPRIVATE
  GdiexCreate

调用的时候,只需要在工程中包含gdiex.h, 输入gdiex.lib,就可以调用到这个API

ISaveDDCtl * pCtl = NULL;
CoInitialize( NULL );

hr = GdiexCreate( (LPVOID*) &pCtl );
if(FAILED( hr )) {
return hr;
}
... ...
GdiexFree( (LPVOID) &pCtl ); //gdiex释放API,在gdiex模块中定义。
CoUninitialize();

就是这样,调用者没有出现多余的访问,就可以获得接口。而且C/C++都可以很好的工作。

时间: 2024-08-02 18:34:43

加载COM的方式的相关文章

Html加载网页的方式

  UIWebView提供了3种加载页面的方式: - (void)loadRequest:(NSURLRequest *)request; - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL; - (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName base

简单的两种Extjs formpanel加载数据的方式_javascript技巧

1.formpanel数据源和grid相同,使用 Form.getForm().loadRecord(row);则数据便可自动加载在formpanel中对应的控件.2.formpanel数据源是单独的,则store传入到formpanel页面后,还需要手动将formpanel中的每个控件用value赋值,形如: 复制代码 代码如下: <span style="font-size:18px;">{                          xtype: "t

iOS原生如何加载HTML中img标签的图片

原文出自:iOS原生如何加载HTML中img标签的图片 前言 最近iOS App项目中使用Webview加载H5页面比较多,也有不少朋友经常问到这个问题,在这里我也学习学习如何通过iOS原生的方式来加载H5页面中的图片然后让webview显示图片. 相信有很多朋友也遇到过这样的问题,可是很多朋友都没有思路,不知如何入手.今天,刚好学习了一下,并写了一个简单的demo.下面让我们一起来学习一下吧! 本篇文章适合哪些人群阅读? 项目中有类似需求的,而又没有思路的 曾经做过类似需求的,可以参考两者的思

漫谈JVM热加载技术(一)---目前常见的解决方案

目前的Hot Reload方案 目前一般是容器(Web Container/Framework)才有能力做到热加载.因为通过自定义的ClassLoader实例来管理(bean/page/controller/configuration),如果这些文件有变化,立即创建一个新的ClassLoader实例来加载新的资源文件.例如:tomcat/jetty/Resin/.../SEAM/Grails 1.Hot deploy 应该称之为:热部署.热部署并不神秘,最暴力的热部署是自动重启当前应用的JVM.

Android RecyclerView实现下拉刷新和上拉加载_Android

RecyclerView已经出来很久了,许许多多的项目都开始从ListView转战RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情. 在ListView上,我们可以通过自己添加addHeadView和addFootView去添加头布局和底部局实现自定义的上拉和下拉,或者使用一些第三方库来简单的集成,例如Android-pulltorefresh或者android-Ultra-Pull-to-Refresh,后者的自定义更强,但需要自己实现上拉加载. 而在下面我们将用两种方式

jQuery处理图片加载失败的常用方法_jquery

本文实例讲述了jQuery处理图片加载失败的常用方法.分享给大家供大家参考.具体如下: 这里演示用 jQuery 替换源来提醒用户加载失败及隐藏的方法. // 方法 1:更换图片地址 $('img').error(function(){ $(this).attr('src', '加载失败.png'); }); // 方法 2:隐藏它 $("img").error(function(){ $(this).hide(); }); 希望本文所述对大家的jQuery程序设计有所帮助. 以上是小

javascript-点击超链接后新页面没加载js

问题描述 点击超链接后新页面没加载js 问题是这样:两个页面 A B,A页面有个超链接,点击A页面的超链接后跳转到B页面,但是B页面没加载JS,刷新B页面之后才加载JS,怎样点击超链接之后自动刷新B页面或者自动加载JS,或者我这个B页面无法加载JS是什么原因造成的? 解决方案 a链接跳转到另外一个页面或者在本页面显示都是重新加载的,你的B页面渲染后js不显示要麽是你的js路径没有对,这个好检查,另一个就是你的写法是调用jquery库的,这时候你就得检查了,先加载jquery库文件,然后在加载你自

java 加载dll介绍(转)

最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对大家的类似工作有所帮助  首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述.  其次,Java中加载dl

Java ClassLoader基础及加载不同依赖 Jar 中的公共类

本文主要介绍 ClassLoader 的基础知识,ClassLoader 如何动态加载 Jar,ClassLoader 隔离问题及如何加载不同 Jar 中的公共类. 本文工程开源地址见:Java Dynamic Load Jar@Github,Clone 以后直接以 Java Application去运行 java-dynamic-loader-host 工程即可. 其实本文只是 Android 插件化的一个引子,做过 Android 插件化的同学,可以试试对于 Android Support