Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# _使用导入的TLB文件中的对象时执行com_错误_C#_C++_.net_Com_Regasm - Fatal编程技术网

C# _使用导入的TLB文件中的对象时执行com_错误

C# _使用导入的TLB文件中的对象时执行com_错误,c#,c++,.net,com,regasm,C#,C++,.net,Com,Regasm,我目前正在实验室项目中使用BTS生物工程SDK(实时肌电数据采集设备)。根据其文档,来自SDK的库(.dll)是用C语言编写的,可以通过在.NETFramework中注册Rigas.EXE来在C++项目中使用。基本工作样本项目以两种语言提供 我想做的事情:在VisualStudio中使用这些库从头创建C++项目。最后,我想用Qt创建一个GUI来实时显示数据采集 工作原理: .dll文件已使用程序集注册工具(Regasm.exe)成功注册。注册是在Visual Studio配置中的预生成事件中完

我目前正在实验室项目中使用BTS生物工程SDK(实时肌电数据采集设备)。根据其文档,来自SDK的库(.dll)是用C语言编写的,可以通过在.NETFramework中注册Rigas.EXE来在C++项目中使用。基本工作样本项目以两种语言提供

我想做的事情:在VisualStudio中使用这些库从头创建C++项目。最后,我想用Qt创建一个GUI来实时显示数据采集

工作原理:

  • .dll
    文件已使用程序集注册工具(Regasm.exe)成功注册。注册是在Visual Studio配置中的预生成事件中完成的<生成code>.tlh和
    .tli
    字段
  • 它成功构建,没有任何错误或警告
  • 在IDE中可以识别类型和对象 (例如,IPORCOMPTR的定义在Visual Studio中显示为
    C++typedef\u com\u ptr\t bts\u biodaq\u core::IPORCOMPTR
问题:我在运行程序时遇到了一个_com_错误(退出代码3,调用Abort()),我不知道为什么

下面是导致程序崩溃的代码:

#include "stdafx.h"
#include <process.h>

#import "mscorlib.tlb" auto_rename
#import "bts.biodaq.drivers.tlb"
#import "bts.biodaq.core.tlb"

using namespace std;
using namespace mscorlib;
using namespace bts_biodaq_core;
using namespace bts_biodaq_drivers;

int _tmain(int argc, _TCHAR* argv[])
{
    USES_CONVERSION;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    IPortCOMPtr ptrCOMPort(__uuidof(PortCOM)); // _com_error here

    return 0;
}
执行时出现错误消息:

Debug Error
Program: C:\Users\myname\source\repos\Test\Debug\Test.exe
abort() has been called
我对C#、COM接口和类型库(.tlb)一无所知,所以对你们中的一些人来说,答案可能是显而易见的。任何帮助都将不胜感激!如果需要,我可以添加更多代码或信息


谢谢!:)

您如何知道这是一个
\u com\u错误
?从问题中包含的错误消息来看,这并不明显。有其他信息吗?如果它是一个
\u com\u错误
,那么捕获它并打印它的错误消息怎么样?嗨!当我添加一个断点时,它会在Test.EXE中抛出:<代码> 0x764 1A6E2未处理的异常:微软C++异常:内存位置0x00 53fb7c的μCOMILION错误。< /代码>。如果我使用
try{…}catch(_-com\u-error&e){printf(“%s”,e.Description())}
,(或e.ErrorMessage())控制台中没有显示任何内容,并且错误的描述并不总是被填充。应该始终填写的是Error(HRESULT):它的值是多少?@SimonMourier如果我使用
std::string message=std::system_category().message(e.Error());std::cout程序集导出到“C:\Users\myname\source\repos\Test\Dependencies\bts.biodaq.drivers.tlb”,类型库已成功注册1>Microsoft.NET Framework程序集注册实用程序版本4.8.4084.0 1>对于Microsoft.NET Framework版本4.8.4084.0未注册的类是典型的0x80040154错误(谷歌在上面,你并不孤单)。这意味着…嗯..带有CLSID_uuuuidof(PortCOM)的类没有注册。这可能是x86对x64的问题。你的客户端以x86运行,而你的.dll注册为x64或相反。或者使用sysinternals中的ProcMon并按注册表筛选来跟踪可能失败的内容。
Debug Error
Program: C:\Users\myname\source\repos\Test\Debug\Test.exe
abort() has been called