尝试获取类方法指针时出现 E_NOINTERFACE

2024-03-14

我从 C++ 非托管代码调用 C# 方法。我在从数组中返回的类实例获取值时遇到问题。

我稍微简化了代码

这是有问题的方法。

    [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
    public ScOrder[] GetOrders()
    {
        return new ScOrder[] {

            (new ScOrder(1),
            (new ScOrder(2)
        };
    }

这是 IScOrder 接口

[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IScOrder
{
    long GetQuantity();
}

这是 ScOrder 实现

[ComVisible(true)]
[Guid("F739759E-4D00-440E-B0B7-69AAF97FCB6D")]
[ClassInterface(ClassInterfaceType.None)]
public class ScOrder
{
    private long quantity = 0;

    public ScOrder() {}

    public ScOrder(long quantity)
    {
        this.quantity = quantity;
    }

    public long GetQuantity()
    {
        return this.quantity;
    }
}

这是 C++ 代码,在我的 Zdeslav Vojkovic 的帮助下先前的请求 https://stackoverflow.com/questions/12412533/convert-cast-safearray-of-iunknowns-to-an-iterable-array-of-interface-pointers/12420569#12420569。问题已在评论中描述

  • 我没有使用 ATL 也没有使用 MFC。
  • C++ tlb 文件是通过 regasm 生成的。

COM 初始化和调用 GetOrders 方法效果很好

IScProxyPtr iPtr;
CoInitialize(NULL);
iPtr.CreateInstance(CLSID_ScProxy);
SAFEARRAY* orders;
iPtr->GetOrders(&orders);
LPUNKNOWN* punks;
HRESULT hr = SafeArrayAccessData(orders, (void**)&punks);
if(SUCCEEDED(hr)) 
{
    long lbound, ubound;
    SafeArrayGetLBound(orders, 1, &lbound);
    SafeArrayGetUBound(orders, 1, &ubound);
    long elements = ubound - lbound + 1;
    for(int i=0;i<elements;i++) 
    {
        LPUNKNOWN punk = punks[i]; //the punk seems valid 
        IScOrderPtr order(punk); //unfortunatelly, "order" now points to {0x00000000}

        //subsequent attempt to get the value will fail
        long quantity = 0;
        HRESULT procCall;
        //GetQuantity will throw an exception
        procCall = order->GetQuantity((long long *)q); 

    }
    SafeArrayUnaccessData(orders);
}
SafeArrayDestroy(orders);

感谢 Zdeslav,我发现我可以在 order(punk) 中进行调试:

IScOrderPtr order(punk);

所以我走进了秩序(朋克)去看看那里发生了什么。我进入了“comip.h”

// Constructs a smart-pointer from any IUnknown-based interface pointer.
//
template<typename _InterfaceType> _com_ptr_t(_InterfaceType* p) 
    : m_pInterface(NULL)
{
    HRESULT hr = _QueryInterface(p);

...然后我进入了 _QueryInterface(p) 实现,也在 comip.h 中

// Performs a QI on pUnknown for the interface type returned
// for this class.  The interface is stored.  If pUnknown is
// NULL, or the QI fails, E_NOINTERFACE is returned and
// _pInterface is set to NULL.
//
template<typename _InterfacePtr> HRESULT _QueryInterface(_InterfacePtr p) throw()
{
    HRESULT hr;

    // Can't QI NULL
    //
    if (p != NULL) {
        // Query for this interface
        //
        Interface* pInterface;
        hr = p->QueryInterface(GetIID(), reinterpret_cast<void**>(&pInterface));

现在的问题是,返回的“hr”值是 E_NOINTERFACE ...这是不对的。

我不是 C++ 或 COM 专家...请帮助:)


你的班ScOrder似乎没有实施IScOrderC# 端的接口。

本来应该是:

//[ComVisible(true)]
//[Guid("F739759E-4D00-440E-B0B7-69AAF97FCB6D")]
//[ClassInterface(ClassInterfaceType.None)]
public class ScOrder : IScOrder

我评论了[...]上面不是因为它有干扰,而是因为它看起来没有必要:它是IScOrder需要具有 COM 可见性并且应该能够在 C++ 端获取它。

不继承IScOrder您的实例确实有一些接口,但您感兴趣的接口IScOrder确实无法通过指针访问。

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

尝试获取类方法指针时出现 E_NOINTERFACE 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • 返回 Promise 并从中创建 Observable 时出现 Typescript Angular2 错误

    我正在尝试从 ionics 检索令牌storage in getToken 并使用它refreshToken 通过将令牌传递给来查看令牌是否过期 this jwtHelper isTokenExpired this token 根据令牌是否
  • 如何通过包装器将 IDataErrorInfo 验证传递给 XAML

    目前我面临着一个我无法解决的荒谬问题 我编写了一个小包装器 它包装了几乎所有属性并添加了一个属性 但我不知道如何通过他将验证传递给我的 XAML 这是我的代码 XAML
  • 将应用程序导出到 Jar 后,为什么会出现“发生 Java 异常”?

    好吧 我使用 eclipse 将应用程序导出到 JAR 中 但现在每当我尝试运行它时 我都会收到 发生了 Java 异常 当我尝试通过命令行运行它时 它说 C Users Arturas gt java jar D Dropbox Ecli
  • 日期列与字符串的 Athena 分区投影

    我希望使用 Athena Partition Projection 来分析来自 AWS 应用程序负载均衡器的日志文件和 Firehose 发出的日志 S3 中的数据以年 月 日为前缀 也可能以小时为前缀 我已经能够使用消防水带示例 http
  • django使用heroku设置变量SECURE_PROXY_SSL_HEADER

    我正在尝试使用 heroku 在 django 1 8 上设置与 https ssl 相关的变量 但在 Django 1 8 教程中 它说我应该小心设置这个变量 特别是 SECURE PROXY SSL HEADER HTTP X FORW
  • 设置16位灰度QImage的像素值

    我有一个宽度 imagewidth 和高度 imageheight 的 16 位图像 数据当前存储在长度为 imagewidth imageheight 的无符号短整型数组中 我想从我的数据集 称为 数据 创建一个 16 位灰度 QImag
  • ios8如何从通讯录中选择联系人

    我一直在使用 ios7 开发 iOS 应用程序一年 现在我将其升级到 ios8 并看到有一种选择联系人的新方法 我现在做的是 void showABNewPersonViewController Calling the addresbook
  • pandas 数据框中的循环依赖

    以下代码对硬币翻转结果进行投注 您从 100 英镑开始 每次翻转的风险为 5 但由于我的代码根据您的起始余额计算赌注大小 因此赌注始终为 5 英镑 import pandas import matplotlib pyplot as plt
  • Google 网络字体在 Android 4.0 和 4.2.2 中无法使用 Web 视图

    当我在使用 Web 视图的 Android 应用程序中使用 Google Web 字体时 它们在 Android 4 4 版本中运行良好 某些搭载 Android 4 2 的设备显示默认字体 大多数都可以正常工作 然而 在 Android
  • JavaScript ES6 - 计算对象数组的重复项

    我正在为我的产品列表创建一个过滤器来计算所有生产商并显示如下 苹果 3 我从数组中删除了重复项 Apple Apple Apple 我使用了此链接 获取数组中的所有非唯一值 即 重复 多次出现 https stackoverflow com
  • R 中带有动画包的循环 GIF

    我正在尝试创建一个循环播放的 GIFanimation但由于某种原因 即使我设置了选项loop TRUE 我制作的图像只播放一次然后停止 我希望 GIF 能够无限期地播放 有小费吗 install packages animation li
  • 使用 knitr 和 .Rnw for LaTeX,如何在 PDF 输出中打印完整的参考书目?

    我似乎无法破解所有可能性并在 RStudio 的 PDF 输出中插入完整的参考书目 knitr Rnw 脚本和 编译 PDF 按钮 PDF 中所需的文本是引用作品的详细信息 这是一个小人国的 bibtex 文件 名为jabrefbibtes
  • Google App Engine - 删除 JPQL 查询和级联

    我注意到 使用下面的 JPQL 查询时 PersistentUser 的子项不会被删除 但是 如果我执行以下操作 子项将被删除entityManager remove object 这是预期的吗 为什么下面的 JPQL 查询不执行级联删除
  • 如何在 Teradata 14 中对子字符串进行分组?

    我有下表天睿14 我不允许自己编写过程和函数 但我可以使用strtok strtok split to table etc id property 1 1234X Yel 2225Y Red 1234X Gre 2 3 1222Y Pin
  • 匹配来自两个不同数据帧的键

    我有两个数据框 df1 Name Stage Description key 0 Sri 1 Sri is one of the good singer in this two one 1 NaN 2 Thanks for reading
  • SSL 握手调试不再适用于 Apache Tomcat/9.0.0.M22

    我必须在 Tomcat 操作系统 MS Windows 上调试 SSL 握手 因此我按照网上找到的说明进行操作 并在 setenv bat 中使用以下行启用了它 设置 JAVA OPTS JAVA OPTS Djavax net debug
  • 为什么跨域 JSONP 安全,而跨域 JSON 不安全?

    我在连接最近了解 JSONP 的一些点时遇到了困难 这是我的理解 由于同源政策 禁止任何内容 包括 JSON 的跨域 XmlHttpRequest 这可以防止 XSRF 您可以使用带有返回 JSONP 的 src 的脚本标记 在对 Java
  • 滚动日志文件并删除旧日志文件

    我正在开发一个基于 Java SOAP 的 Web 服务应用程序 其中我将 stdout 作为日志写入文本文件以供参考 该文件正在巨大地增长 因此我需要检查文件的大小 例如 如果文件大小超过 10 Mb 我必须创建另一个文件 像这样 我必须
  • 如何在嵌套函数中传递对象?

    我正在尝试覆盖save 在 R 中 以便在保存对象之前创建任何丢失的目录 我在使用省略号方法将对象通过一个函数传递到另一个函数时遇到问题 我的例子 save lt function file Overridden save target d
  • 尝试获取类方法指针时出现 E_NOINTERFACE

    我从 C 非托管代码调用 C 方法 我在从数组中返回的类实例获取值时遇到问题 我稍微简化了代码 这是有问题的方法 return MarshalAs UnmanagedType SafeArray SafeArraySubType VarEn