【发布时间】: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