本帖最后由 blueskynrg 于 2015-7-6 13:50 编辑
这是我经过3天时间的摸索,得到的一个解决题目所述问题的方法。期望各位朋友和
labview高手分享一些更简洁、易用和高效的方法。
用Labview做的一个软件,根据业务需求,电脑上连接两个打印机:一个条码打印机,一个普通A4纸打印机,分别打印软件生成的 60mm*40mm条码标签 和 A4纸大小的报表。
出现的问题:由于Labview软件将文档直接输出到 系统默认打印机,而系统在同一时刻只能有一台默认打印机。如果将生成的标签输出到A4纸打印机,或者将A4纸大小的报表输出到条码打印机,都会导致打印出错。
解决思路:每次生成标签或者报表之前,检查系统的默认打印机是否匹配,若不匹配,则将所需打印机更改为系统默认打印机。
两个要解决的问题:1、得到系统的默认打印机 和 所有可用打印机;
2、将指定打印机设为
系统默认打印机。
面对以上两个问题,网上搜了很多资料,发现只有C#的文章较多,而Labview的相关文章直接就找不到,悲催啊!还好有一点Java的基础,C#的代码还勉强看得下去,硬着头皮看吧!
经过不断尝试,最终用这篇博客里的代码实现了:http://blog.sina.com.cn/s/blog_5a4961490101cd6l.html
更改了部分代码后的项目文件:
至此,可以算是成功了一半,接下来就是用C#生成DLL,然后用Labview调用这个DLL了。
用 Visual Studio ,C# 制作DLL的详细步骤参见:
http://jingyan.baidu.com/article/4853e1e519930c1909f7269a.html
将项目“Printers”的代码修改后,封装3个函数到DLL内:
SetDefaultPrinter、DefaultPrinter、GetLocalPrinters,
具体C#代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Runtime.InteropServices;
- using System.Drawing.Printing;
- namespace GetLocalPrinters
- {
- public class LocalPrinter
- {
- // 导入“winspool.drv”,调用“SetDefaultPrinter”方法设置默认打印机
- [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
- private static extern long SetDefaultPrinter(string pszPrinter);
-
- // 获取本机默认打印机名称
- public static String DefaultPrinter
- {
- get { return new PrintDocument().PrinterSettings.PrinterName; }
- }
-
- // 获取本机的打印机列表。列表中的第一项就是默认打印机。
- public static String[] GetLocalPrinters()
- {
- List fPrinters = new List();
- fPrinters.Add(DefaultPrinter); // 默认打印机始终出现在列表的第一项
- foreach (String fPrinterName in PrinterSettings.InstalledPrinters)
- {
- if (!fPrinters.Contains(fPrinterName))
- fPrinters.Add(fPrinterName);
- }
- System.String[] str = fPrinters.ToArray();
- return str;
- }
- }
- }
复制代码
生成DLL文件后,通过Labview中的:互连接口 ——》库与可执行程序 ——》调用库函数
调用DLL,
发现无法列出DLL内的函数,红色框这里的“函数名”下拉列表点不动。卡住了!
怀疑是 DLL 文件的制作有问题。百度了一下“
Labview 调用 C# 编写的DLL”,原来是调用DLL的方式有问题。
方法参见:https://bbs.elecfans.com/jishu_335329_1_1.html,
感谢这个帖子主人的分享。
按照上述方法调用之后,发现只能列出函数“GetLocalPrinters”,
Labview 程序如下:
执行后列出了系统所有打印机,其中第一项为默认打印机,小惊喜一下:
但是另一个必须的方法“SetDefaultPrinter”该怎么调用呢?又卡住了!
注意到,C#代码里有 ”
DllImport("winspool.drv")“,估计通过Labview调用C#的DLL,再通过这个DLL来调用”winspool.drv“这种两级调用的方式是行不通的,考虑是不是直接用Labview调用”winspool.drv“就行了呢?
通过Labview中的:互连接口 ——》库与可执行程序 ——》调用库函数
调用”winspool.drv“,果然在函数列表里看到了很多函数,选择”SetDefaultPrinterA
“,增加一个字符串类型的输入参数,
Labview 程序如下:
执行后系统的默认打印机改变:
至此,大功告成!噢耶!
附上最终的 C# 项目源码,和 Labview 源码:C#:
Labview:
11