QT调用Interop.LabelManager2.dll(C#dll)的问题处理

来源:互联网 发布:linux eagle监控软件 编辑:程序博客网 时间:2024/06/05 03:58

需求:

公司产线需要打印设备条码,便于简化生产步骤,因此需要在生产测试程序中添加打印条码的功能,原工具是由QT写的,因此沿用QT去实现功能。领导给了个C#的库,让做引用实现功能,可以与原生产对接。

先说结果,我最终采取了C++封装C#的DLL文件,在QT中调用封装好的C++的DLL解决的问题。

问题的核心在于怎么在QT中引用C#,QT是C++的扩展语言,支持原生C++;但是C++一般为非托管式代码,C#是托管式语言,直接去调用肯定存在问题。

  1. 首先去查得到的是封装成COM组件然后再QT里调用COM组件,上面的DLL已经是封装好的,只需要查看如何调用即可。

    在QT的官网找到文档,有人成功过,在这个帖子里发现的,不过我没有成功。
    在文档给出的四种方法中,我尝试了第一种dumpcpp的方法,自己没有成功,在解决问题后发现了这个文档,可以进行尝试一下,当初在这四种方法里琢磨了好久,英文文档看着费劲而且文档内没有个好的实例,最终还是没能出坑
    用Qlibrary直接导入库是不行的,因为其是针对于c编写的dll的。

  2. 将程序分为两块,一个是用是c#写的打印程序,一个是正常的产线工具,执行打印时产线工具执行打印的exe去打印标签。

    思路很直接,只借用C#去写打印程序,然后编译成exe用QT调用即可。然而依旧出现了问题,在用QProcess类执行exe文件的会出现exe无法实现打印功能的现象,但是程序是启动了,单独执行exe文件正常,未查明原因(待做)。因为这个原因,另一个思路将打印用C#做成exe程序通过socket通信的思路也行不通了。

  3. 将C# dll通过C++封装成C++的dll,通过QT去调用c++的dll文件。

    看到这种方法很早,但是觉得转换两次有点麻烦,就放置在一旁,然而这种方法却是比较简单的。
    首先在vs里建立工程CallCsharp:
    新建->项目->Virtual C++->win32程序->下一步->dll->完成.
    右键解决方案->属性->在常规-属性默认值中的公共语言运行时支持添加/CLR。
    用C++就可以直接调用C#的库了。

    //CallCsharp.c    #include <direct.h>    #include <string.h>    #include "stdafx.h"    #include "CallCsharp.h"    using namespace LabelManager2;    using namespace System;    PPSAPI void CallCsharp::print_info()    {        ApplicationClass ^ lbl = gcnew ApplicationClass();        /*char LabPath[256];//get current workpath        getcwd(LabPath, 128);        strcat(LabPath, "\Produce.lab");*/        lbl->Documents->Open("E:\\Produce.lab", false);        Document ^doc = lbl->ActiveDocument;        doc->Variables->FormVariables->Item("Name")->Value = "aaa";        doc->Variables->FormVariables->Item("Model")->Value = "bbb";        doc->Variables->FormVariables->Item("Power")->Value = "ccc";        doc->Variables->FormVariables->Item("TP")->Value = "ddd";        doc->Variables->FormVariables->Item("ID")->Value = "eee";        doc->Variables->FormVariables->Item("S/N")->Value = "fff";        doc->PrintDocument(2);        lbl->Documents->CloseAll(true);        return  void();    }

    // CallSharp.h
    CallSharp.h
    生成dll,最后拷贝.h和.lib,.dll(引用的和生成的两个)四个文件即可,拷贝到QT的工作目录,dll文件最后要放入Debug目录。

    • 注意在qt中调用dll库时,将qt中常用的QString转换成char*
    • 我在封装的库中获取当前目录的绝对路径时遇到了点问题,是字符类型转换的问题。
  4. 将QT中引入/CLR公共语言运行时支持,在QT中直接使用,c#库中的函数,这种方法是后来的找到的,发现应该也是有戏的,特此做个记录。

    官方文档:Link
    论坛相关问题:Link
    反正在QTcreator中,我没成功;而我的VS安装QT插件后,能创建QT工程,却打不开pro文件,因此这种方法我没有办法测试,先在此记录下来。