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#是托管式语言,直接去调用肯定存在问题。
首先去查得到的是封装成COM组件然后再QT里调用COM组件,上面的DLL已经是封装好的,只需要查看如何调用即可。
在QT的官网找到文档,有人成功过,在这个帖子里发现的,不过我没有成功。
在文档给出的四种方法中,我尝试了第一种dumpcpp的方法,自己没有成功,在解决问题后发现了这个文档,可以进行尝试一下,当初在这四种方法里琢磨了好久,英文文档看着费劲而且文档内没有个好的实例,最终还是没能出坑
用Qlibrary直接导入库是不行的,因为其是针对于c编写的dll的。将程序分为两块,一个是用是c#写的打印程序,一个是正常的产线工具,执行打印时产线工具执行打印的exe去打印标签。
思路很直接,只借用C#去写打印程序,然后编译成exe用QT调用即可。然而依旧出现了问题,在用QProcess类执行exe文件的会出现exe无法实现打印功能的现象,但是程序是启动了,单独执行exe文件正常,未查明原因(待做)。因为这个原因,另一个思路将打印用C#做成exe程序通过socket通信的思路也行不通了。
将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
生成dll,最后拷贝.h和.lib,.dll(引用的和生成的两个)四个文件即可,拷贝到QT的工作目录,dll文件最后要放入Debug目录。- 注意在qt中调用dll库时,将qt中常用的QString转换成char*
- 我在封装的库中获取当前目录的绝对路径时遇到了点问题,是字符类型转换的问题。
将QT中引入/CLR公共语言运行时支持,在QT中直接使用,c#库中的函数,这种方法是后来的找到的,发现应该也是有戏的,特此做个记录。
官方文档:Link
论坛相关问题:Link
反正在QTcreator中,我没成功;而我的VS安装QT插件后,能创建QT工程,却打不开pro文件,因此这种方法我没有办法测试,先在此记录下来。
- QT调用Interop.LabelManager2.dll(C#dll)的问题处理
- Qt调用C的DLL
- Unable to load DLL 'SQLite.Interop.dll' 问题的解决方案
- 调用C或C++的DLL出现“方法的类型签名与 Interop 不兼容”
- c++/clr DLL调用MFC DLL需要注意的问题
- Delphi调用C#dll的问题
- vc++调用c#dll时的问题
- 调用C++dll遇到的问题
- C#.winform使用sqlite发布时提示无法找到SQLite.Interop.dll的问题
- QT调用dll、外部程序调用QT的dll.md
- Qt调用dll的步骤
- mfc调用qt的dll
- QT调用QT Dll
- QT生成DLL,调用DLL
- QT生成DLL,调用DLL
- QT生成DLL,调用DLL
- QT调用vc dll中文乱码的问题
- Qt DLL总结【二】-创建及调用QT的 DLL
- sql
- Print Article HDU 3507(斜率DP入门模板题)
- 【量亿数据-A股level2数据】周K线分析
- win32 软件开发项目中用到的CString对象的成员函数
- Python3教程Web开发实战梳理-day5(Web框架)
- QT调用Interop.LabelManager2.dll(C#dll)的问题处理
- 【python】打飞机小游戏(一)
- 2440使用ov7670摄像头寄存器配置(待续)
- Servlet案例之统计访问量与获取类路径下资源
- 网易云课堂JAVA入门编程题5-1
- 4.0新特性中的Tuple
- spring自动加载,使用实现类无法加载,使用接口却可以的原因
- K
- MyEclipse中项目有红色感叹号的解决方法总结