【问题标题】:Creating COM interface pointer in DLL method works when called from one application but does not when called from another application在 DLL 方法中创建 COM 接口指针在从一个应用程序调用时有效,但在从另一个应用程序调用时无效
【发布时间】:2018-03-29 12:36:16
【问题描述】:

我正在使用 COM 互操作从 C++ dll 调用 C# dll 中的方法。 C++ dll 是从另一个对我来说本质上是一个黑盒子的应用程序调用的(例如,我看不到它的任何代码。)

当此应用程序调用 C++ dll 中的方法时,它会按预期执行,直到尝试为 C# COM 接口创建指针/分配内存,此时方法失败(记录错误):

TJIntegration::ITJInterfacePtr tJPtr = NULL;
HRESULT hRes = tJPtr.CreateInstance(__uuidof(TJIntegration::TJInterface));
if (!(SUCCEEDED(hRes)))
{
  LOG_ERROR << "Could not create pointer for TJInterface. Has the COM DLL been registered?";
}

但是,我创建了一个测试应用程序,它也调用了这个 dll,并且该方法完全按预期执行,包括创建这个指针。

我在同一台机器上测试这些应用程序(注册 dll 的地方),所以我不明白为什么从一个应用程序调用该方法会正常运行,但从另一个应用程序调用时却失败了?

【问题讨论】:

  • 这个问题与您链接的问题有何不同?
  • 当您说指针时,您的意思是它在 COM 对象/函数中分配内存时崩溃了吗?或者调用应用程序只是调用方法而崩溃?还是程序在崩溃之前将其放入 COM 方法中?因为这可能只是基于函数参数的错误。
  • @tobi303 我链接的问题是它在另一台机器上使用时崩溃,这是由于 dll 未注册。这与同一台机器上的不同应用程序(注册 dll 的地方)在调用 dll 时行为不同有关。
  • @KevinHirst 在 COM 对象/函数中分配内存时崩溃(例如,创建指针的行导致崩溃)。该方法被正确调用并按预期执行,直到导致调用应用程序崩溃的特定行。
  • 这只是错误报告。 CoCreateInstance 失败的原因有很多,如果你不显示 hRes 的值那么你就无法知道为什么。

标签: c# c++ visual-studio com


【解决方案1】:

原来我在使用 regasm 注册 dll 时需要使用/codebase 选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多