【问题标题】:Using .NET dll via QT通过 QT 使用 .NET dll
【发布时间】:2021-03-19 16:34:38
【问题描述】:

我几乎没有尝试在 QT 上使用基于 .NET 的 Laser Control dll 文件。 我在服务器上注册了 dll 文件,制作了 tlb 文件,并使用命令导入了它

  #import "Litron.Control.CWLasers.tlb" no_namespace named_guids

之后,我使用了这个命令

struct cwDiodeLaserPIV;
cwDiodeLaserPIV Laser=NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_cwDiodeLaserPIV, NULL, CLSCTX_INPROC_SERVER, IID__cwDiodeLaserPIV, reinterpret_cast<void*>(&Laser));

*我也添加了 ActiveQT 头文件来使用 CoCreateInstance

当我检查此代码是否适用于此时,

if(SUCCEEDED(hr))
{ qDebug()<<"Calling dll is succeded"; }
else
{ qDebug()<<"Calling dll is failed"; }

“调用dll失败”出来了。 但是,当我在 Visual Studio C++ 中使用相同的代码时,会出现“调用 dll 成功”。 而且,即使调用dll成功了,我也无法在VS调用dll的函数。

这里有一些问题。

我使用了 struct cwDiodeLaserPIV。因为在 tlh 文件中,cwDiodeLaserPIV 是用 struct 命令声明的。 但实际上,当我看到 dll 的内部部分时,cwDiodeLaserPIV 是用 class 命令声明的。 为什么会这样?我可以将它与结构声明一起使用吗?

当我在QT,CLSID_和IID_部分写代码时,没有自动连接的目录。 另一方面,在VS处,VS会自动找到CLSID_cwDiodeLaserPIV和IID__cwDiodeLaserPIV 再说一遍,在 QT,当我写下 CLSID_ 或 IID_ 时,在自动连接的目录列表中找不到 CLSID_cwDiodeLaserPIV 和 IID__cwDiodeLaserPIV。为什么会这样?我不能在 QT 使用这种方式吗?

++ 我参考了https://forum.qt.io/topic/108642/how-to-include-a-com-tlb-library-in-my-c-project/2 并使用dumpcpp 制作了cpp 和头文件。但是里面好像没有足够的功能。

我是 QT 和编程方面的专家。因此,示例代码将非常有帮助 非常感谢...

【问题讨论】:

    标签: c# c++ .net qt dll


    【解决方案1】:

    CoCreateInstance 表示您正在使用 COM。这是一项允许您从其他语言调用 C++ 代码的技术,反之亦然。您在.tlh 中看到的struct cwDiodeLaserPIV; 是COM 对象接口的C++ 表示。在其他语言中,可以使用其他表示。例如,DLL 可以用 C# 编写,可以使用关键字class。 COM 是隐藏实现的粘合层,但您可能需要第二个抽象层。纯 COM 很棘手

    您找到的链接描述了dumpcpp 工具,它是#import 语句的替代品。两者都是简化 COM 使用的方法,但它们的工作方式确实不同。 dumpcpp 知道它可以在其实现中使用 Qt 库功能。

    您不能随意混合使用 Qt dumpcpp 方法和 Visual Studio #import 方法。如果使用dumpcpp,则必须使用它生成的接口类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多