最近做了一个Web项目,需要通过页面按钮打印条形码,我们首先使用了国内公司开发的一款ActiveX打印插件(jatoolsPrinter)。使用了free版,一般性的打印都支持,比如打印a4,a8,a16大小的内容,可以指定打印区域,分页打印等。用GDI+画了条形码及需要输出的内容(位图)。打印出来的效果相当不理想,位置便宜太大,无论通过jatoolsPrinter调试都不行,最终启用改控件,自己制作ActiveX控件。
本人只会C#,所以选用C#开发。
- 创建一个类库项目,右键属性勾选图上的选项
- 在AssemblyInfo.cs增加[assembly: AllowPartiallyTrustedCallers()]和[assembly: SecurityRules(SecurityRuleSet.Level1)]
- ActiveX类库的内容大致包括两部分,IObjectSafety接口和实现该接口的控件类。为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口,不能修改GUID。
[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { [PreserveSig] int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); [PreserveSig()] int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); }
- 创建需要调用的类,GUID可以自己生成,<object>标签用的guid就是这个。这里控件功能已经完成了。
<span style="font-size:10px;"></span><pre name="code" class="csharp"> [Guid("cdba6508-d939-4448-bf57-4caf9b52e138")] public class MyPrinter : ActiveXControl { public string GetName(string name) { return name + name; } }
- 使用打包工具生成安装包,这里我用的是InstallShield Limited Editon Project。可以再vs2012中下载安装。安装的时候需要连接vpn通过网站注册信息下载安装包。不用vpn的话获取不到数据,无法选择国家等必填项,估计也不能提交吧。
- 没有特别需要申明的话就一直下一步就行了,比如公司名称地址之类的,需要关注的是第三步。
点击Add Project Outputs,这里我选择了主输出和内容,一般情况下编译之后你只有一个dll的话只需要主输出就行了,如果还有资源配件、安装配置文件的话需要添加内容文件,我这边有一个打印机配置的txt文件,所以勾选了内容文件。当然你如果知道你需要的dll和其他文件的话也可以点击右边的Add Files按钮或则Add Folders按钮。
发布的时候记得选择SingleImage,这样才会将dll、exe打进安装包里面
- 把发布的exe文件放到web目录下面引用。
<object id="panduoPrinter" style="display: none;" classid="clsid:cdba6508-d939-4448-bf57-4caf9b52e138" codebase="/ActiveX/panduoprint.exe"> </object>
我这里没有做cab包,不能静默安装,需要手动下载安装。