如何使用 CoCreateInstance() 获取 com 对象?

2024-03-23

我已经注册了一个COM组件。我想调用它。

CLSID clsid;
RIID iid;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
LPVOID *pRet;
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, pRet);

我可以成功获取 clsid ,但是在哪里可以获取 iid ?

我用OLE VIEWER查找界面:

 [
 odl,
 uuid(F3F54BC2-D6D1-4A85-B943-16287ECEA64C),
 helpstring("Isesoft Interface"),
 dual,
 oleautomation
 ]
 interface Isesoft : IDispatch {

然后我改变了我的代码:

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,  IID_IDispatch,(void **)&pDispatch);

但hr1返回失败。


你的COM类实现了一些接口,每个接口都有它的IID标识符。因此您需要从 COM 组件实现中获取它。这是您的代码,您需要提供准确指定您请求的接口的标识符。

一些 COM 类实现了众所周知的接口,特别是。IDispatch,其标识符是IID_IDispatch, or __uuidof(IDispatch).

UPD。既然您发现感兴趣的界面是Isesoft,您的代码将是:

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT nResult1 = CLSIDFromProgID(OLESTR("se.mysoft"), &clsid);
HRESULT nResult2 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
  IID_Isesoft, (void **) &pDispatch);

To get Isesoft and IID_Isesoft, __uuidof(Isesoft)对于 C++ 代码来说,您需要导入定义,通常是以下两个之一:

  • 其他供应商 SDK 包括例如#include "isesoft\sdk.h"
  • or #import "libid:..." http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx带有类型库标识符(命名空间和其他属性适用)

当你有HRESULT指示失败的代码,请务必发布值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CoCreateInstance() 获取 com 对象? 的相关文章

随机推荐

  • Rx 中的历史调度程序

    我有以下代码 我尝试重播序列 但 PostWorkItem 总是为 null 我不明白为什么 下面的代码给出了堆栈溢出错误 Task
  • 锁内锁

    我想知道这种构造是否会导致错误 lock sync something lock sync something lock sync something 我已经运行了这段代码 看起来不错 但也许在某些情况下可能会引发错误 lock是一个包装器
  • 如何指定头文件引入的库依赖

    假设在 CMake 项目中 我有一个内置到库中的源代码 a cpp void f some code 我有一个标题 b h void f struct X void g f 我还有另一个文件 main cpp include b h int
  • 在 PHP 中压缩字符串的最佳方法[重复]

    这个问题在这里已经有答案了 我正在使用 gzcompress json encode arr 9 压缩数组 所以我使用 json encode 将数组转换为字符串 然后使用 gzcompress 进行压缩 但我找不到结果字符串大小的太大差异
  • 通过 jasperreport 打印整个 HashMap

    我需要通过 jasperreport 打印整个地图 Example Column1 Column2 key1 val1 key2 val2 key2 val2 应该选择什么数据源 报告来源应包含哪些内容 PS 我不想像 P key11 那样
  • Highcharts:确保 y 轴 0 值位于图表底部

    我在页面上输出一系列高图表 在某些情况下 指定时间段内的所有数据可能返回 0 值 在这种情况下 图表如下所示 http jsfiddle net charliegriefer KM2Jx 1 http jsfiddle net charli
  • 光标所在位置未输入字符

    在我的 Ace 编辑器中 滚动条出现后 字符被输入 但不是光标所在的位置 见下图 出了什么问题 该代码在我的开发环境中似乎工作正常 我注意到我的开发环境的字体比我的产品环境的字体大 Dev env 产品环境 我不明白为什么会有差异 以及这是
  • 如何在 Mono/Windows 上使用 gecko-sharp 嵌入 Gecko?

    Gecko 是 Firefox 的渲染引擎 使用 gecko sharp 可以将其嵌入到任何 Mono GTK 程序中 有一个名为的示例应用程序GladeSharp浏览器 http developer novell com wiki ind
  • Sql Server 中的标识列

    为什么 Sql 服务器不允许在一张表中存在多个 IDENTITY 列 任何具体原因 你为什么需要它 SQL Server 会跟踪单一值 当前标识值 对于每个表IDENTITY列 因此每个表只能有一个标识列
  • R - 来自 SpatialPolygons 列表的 SpatialPolygonsDataFrame

    我正在寻找一种从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame 的方法 下面是一个多边形列表的示例 应从中创建包含列表中所有多边形的 SpatialPolygonsDataFrame 编辑 Sp
  • 致命错误:未捕获 OAuthException:(#803) 您请求的某些别名不存在

    致命错误 未捕获的 OAuthException 803 您请求的某些别名不存在 0 309479102458745 在第 1039 行的 base facebook php 中抛出 我的应用程序工作正常 然后突然许多用户收到此错误 0 3
  • Codeigniter 增加会话超时不起作用

    我是 codeigniter 框架的新手 我遇到页面会话超时问题 现在我已经启用了 ip 匹配 用户代理匹配 但不起作用 我尝试过的另一种方法是更新 2 1 4 库文件并将其复制到我的系统中 文件夹但这也不起作用 请帮助我解决会话超时问题
  • Elasticsearch 中对象聚合的嵌套数组

    Elasticsearch 中的文档是这样索引的 文件1 task completed 10 tagged object category cat count 10 category cars count 20 文件2 task compl
  • 将参数添加到“队列新建”对话框

    我基于 DefaultTemplate xaml 构建了一个自定义构建流程模板 并添加了一些参数 它们在 构建定义 窗口中显示良好 但我找不到将它们显示在 队列新构建 对话框的参数选项卡上的方法 我希望这是可能的 我宁愿不需要为参数的每个变
  • 如果目录为空,如何跳过 grunt 任务

    我正在使用 grunt contrib 的concat and uglify处理一些 javascript 的模块 目前如果src js 是空的 他们仍然会创建一个 空 连接文件 以及缩小版本和源映射 我想要检测是否src js 继续之前文
  • Rails 3 验证:存在 => false

    这是我期望的一个非常简单的问题 但我在指南或其他地方找不到明确的答案 我的 ActiveRecord 有两个属性 我希望其中一个存在 另一个为零或空白字符串 我该如何做相当于 presence gt false 的事情 我想确保该值为零 v
  • 为什么将字符串文字传递给调用 std::format 的模板无法编译?

    以下代码片段无法在最新版本的 MSVC Visual Studio 2022 17 2 2 上编译 相同的代码片段似乎在以前的编译器版本上运行得很好 include
  • Python csv:合并具有相同字段的行

    我正在尝试将几行 csv 数据合并为一长行 前提是两个单元格包含相同的数据 例如 采用以下 csv one two three 1 2 3 4 5 6 7 8 9 1 1 1 4 4 4 如果两行在 row 0 处共享相同的值 我希望将第二
  • 当用户输入的参数多于预期时,强制 VBA 中的 UDF 显示 MsgBox?

    当用户输入太多参数时COUNTBLANK函数 该函数显示此错误消息 并返回到编辑模式 您为此函数输入了太多参数 如何使任何 UDF 都像这样工作 例如 Function COUNT2 c As Range COUNT2 c Count En
  • 如何使用 CoCreateInstance() 获取 com 对象?

    我已经注册了一个COM组件 我想调用它 CLSID clsid RIID iid HRESULT hr CLSIDFromProgID OLESTR se mysoft clsid LPVOID pRet HRESULT hr1 CoCre