C# _使用导入的TLB文件中的对象时执行com_错误
我目前正在实验室项目中使用BTS生物工程SDK(实时肌电数据采集设备)。根据其文档,来自SDK的库(.dll)是用C语言编写的,可以通过在.NETFramework中注册Rigas.EXE来在C++项目中使用。基本工作样本项目以两种语言提供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配置中的预生成事件中完
我想做的事情:在VisualStudio中使用这些库从头创建C++项目。最后,我想用Qt创建一个GUI来实时显示数据采集
工作原理:
文件已使用程序集注册工具(Regasm.exe)成功注册。注册是在Visual Studio配置中的预生成事件中完成的<生成code>.tlh和.dll
字段.tli
- 它成功构建,没有任何错误或警告
- 在IDE中可以识别类型和对象
(例如,IPORCOMPTR的定义在Visual Studio中显示为
)C++typedef\u com\u ptr\t bts\u biodaq\u core::IPORCOMPTR
#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