高手们好,我最近在做一个要用到条码打印机的BS系统,用的是立象的打印机,我做了一个button,用立象提供的DLL里的方法来操作打印,第一次点击button打印正常,但第二次点击就出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”,我觉得是DLL没有释放内存,但不知道怎么释放,网上很多都是用DLL里面的freeLibrary方法,但我用的这个DLL的API里面只有操作打印机的一些方法,没有freeLibrary方法。
    另外我用CS模式的窗口来测试时,重复点击打印很多次都没有问题,不知道BS下重复打印出现的这个问题如何解决?还请大家多多指教。以下是我调用DLL的类的代码,button的点击事件会调用doPrint()方法:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices;/// <summary>
/// dllOperator 的摘要说明
/// </summary>
public class dllOperator
{
    const string szSavePath = "C:\\PPLB_Example.Prn";
    [DllImport("Winpplb.dll")]
    private static extern int B_Bar2d_Maxi(int x, int y, int cl, int cc, int pc, string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Bar2d_PDF417(int x, int y, int w, int v, int s, int c, int px,
        int py, int r, int l, int t, int o, string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Bar2d_PDF417_N(int x, int y, int w, int h, string para, string data);
    [DllImport("Winpplb.dll")]
    private static extern void B_ClosePrn();
    [DllImport("Winpplb.dll")]
    private static extern int B_CreatePrn(int selection, string filename);
    [DllImport("Winpplb.dll")]
    private static extern int B_Del_Form(string formname);
    [DllImport("Winpplb.dll")]
    private static extern int B_Del_Pcx(string pcxname);
    [DllImport("Winpplb.dll")]
    private static extern int B_Error_Reporting(char option);
    [DllImport("Winpplb.dll")]
    private static extern string B_Get_DLL_Version(int nShowMessage);
    [DllImport("Winpplb.dll")]
    private static extern int B_Get_DLL_VersionA(int nShowMessage);
    [DllImport("Winpplb.dll")]
    private static extern int B_Get_Pcx(int x, int y, string filename);
    [DllImport("Winpplb.dll")]
    private static extern int B_Initial_Setting(int Type, string Source);
    [DllImport("Winpplb.dll")]
    private static extern int B_Load_Pcx(int x, int y, string pcxname);
    [DllImport("Winpplb.dll")]
    private static extern int B_Open_ChineseFont(string path);
    [DllImport("Winpplb.dll")]
    private static extern int B_Print_Form(int labset, int copies, string form_out, string var);
    [DllImport("Winpplb.dll")]
    private static extern int B_Print_MCopy(int labset, int copies);
    [DllImport("Winpplb.dll")]
    private static extern int B_Print_Out(int labset);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow,
        int width, int height, char human, string data);
    [DllImport("Winpplb.dll")]
    private static extern void B_Prn_Configuration();
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text(int x, int y, int ori, int font, int hor_factor,
        int ver_factor, char mode, string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text_Chinese(int x, int y, int fonttype, string id_name,
        string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text_TrueType(int x, int y, int FSize, string FType,
        int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name,
        string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text_TrueType_W(int x, int y, int FHeight, int FWidth,
        string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut,
        string id_name, string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_Select_Option(int option);
    [DllImport("Winpplb.dll")]
    private static extern int B_Select_Option2(int option, int p);
    [DllImport("Winpplb.dll")]
    private static extern int B_Select_Symbol(int num_bit, int symbol, int country);
    [DllImport("Winpplb.dll")]
    private static extern int B_Select_Symbol2(int num_bit, string csymbol, int country);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Backfeed(char option);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_BMPSave(int nSave, string strBMPFName);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Darkness(int darkness);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_DebugDialog(int nEnable);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Direction(char direction);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Form(string formfile);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Labgap(int lablength, int gaplength);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Labwidth(int labwidth);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Originpoint(int hor, int ver);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Prncomport(int baud, char parity, int data, int stop);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Prncomport_PC(int nBaudRate, int nByteSize, int nParity,
        int nStopBits, int nDsr, int nCts, int nXonXoff);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_Speed(int speed);
    [DllImport("Winpplb.dll")]
    private static extern int B_Set_ProcessDlg(int nShow);
    [DllImport("Winpplb.dll")]
    private static extern int B_GetUSBBufferLen();
    [DllImport("Winpplb.dll")]
    private static extern int B_EnumUSB(byte[] buf);
    [DllImport("Winpplb.dll")]
    private static extern int B_CreateUSBPort(int nPort);
    [DllImport("Winpplb.dll")]
    private static extern int B_ResetPrinter();
    [DllImport("Winpplb.dll")]
    private static extern int B_GetPrinterResponse(byte[] buf, int nMax);
    [DllImport("Winpplb.dll")]
    private static extern int B_TFeedMode(int nMode);
    [DllImport("Winpplb.dll")]
    private static extern int B_TFeedTest();
    [DllImport("Winpplb.dll")]
    private static extern int B_CreatePort(int nPortType, int nPort, string filename);
    [DllImport("Winpplb.dll")]
    private static extern int B_Execute_Form(string form_out, string var);
    [DllImport("Winpplb.dll")]
    private static extern int B_Bar2d_QR(int x, int y, int model, int scl, char error,
        char dinput, int c, int d, int p, string data);
    [DllImport("Winpplb.dll")]
    private static extern int B_GetNetPrinterBufferLen();
    [DllImport("Winpplb.dll")]
    private static extern int B_EnumNetPrinter(byte[] buf);
    [DllImport("Winpplb.dll")]
    private static extern int B_CreateNetPort(int nPort);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text_TrueType_Uni(int x, int y, int FSize, string FType,
        int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name,
        byte[] data, int format);
    [DllImport("Winpplb.dll")]
    private static extern int B_Prn_Text_TrueType_UniB(int x, int y, int FSize, string FType,
        int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name,
        byte[] data, int format);
    [DllImport("Winpplb.dll")]
    private static extern int B_GetUSBDeviceInfo(int nPort, byte[] pDeviceName,
        out int pDeviceNameLen, byte[] pDevicePath, out int pDevicePathLen);
    public dllOperator()
{       
}    public void doPrint(String strText,int count)
    {
        int nLen, ret;
        byte[] pbuf = new byte[128];
        string ver, strmsg;
        System.Text.Encoding encAscII = System.Text.Encoding.ASCII;
        System.Text.Encoding encUnicode = System.Text.Encoding.Unicode;        // dll version.
        ver = B_Get_DLL_Version(0);//取得或秀出此函數庫版本資訊。        // search port.
        nLen = B_GetUSBBufferLen() + 1;//查詢 USB 埠資料長度
        strmsg = "DLL ";
        strmsg += ver;
        strmsg += "\r\n";
        if (nLen > 1)
        {
            byte[] buf1, buf2;
            int len1 = 128, len2 = 128;
            buf1 = new byte[len1];
            buf2 = new byte[len2];
            B_EnumUSB(pbuf);//取得 USB 埠的資料
            B_GetUSBDeviceInfo(1, buf1, out len1, buf2, out len2);//取得 USB 埠的裝置名稱和裝置路徑。
            ret = B_CreatePrn(12, encAscII.GetString(buf2, 0, len2));// open usb.開啟 Printer 工作。
            if (0 != ret)
            {
                strmsg += "Open USB fail!";
            }
            else
            {
                strmsg += "Open USB:\r\nDevice name: ";
                strmsg += encAscII.GetString(buf1, 0, len1);
                strmsg += "\r\nDevice path: ";
                strmsg += encAscII.GetString(buf2, 0, len2);
            }
        }
        else
        {
            ret = B_CreatePrn(0, szSavePath);// open file.開啟 Printer 工作。
            strmsg += "Open ";
            strmsg += szSavePath;
            if (0 != ret)
            {
                strmsg += " file fail!";
            }
            else
            {
                strmsg += " file succeed!";
            }
        }
        
        if (0 != ret)
            return;
        // sample setting.
        B_Set_DebugDialog(1);//設定除錯環境。
        B_Set_Originpoint(0, 0);//設定開始列印點。
        B_Select_Option(2);//設定轉印模式、啟動 Cutter 或 Peel。
        B_Set_Darkness(8);//設定熱感頭列印熱度。
        B_Set_Backfeed('F');
        B_Del_Pcx("*");// delete all picture.刪除 Pcx 圖檔。      
        B_Bar2d_QR(420, 200, 1, 3, 'M', 'M', 12, 15, 30, strText);//列印 QR 條碼 "QR CODE"
        B_Print_Out(count);// copy 1.列印所有資料。
        B_ClosePrn();//關閉 Printer 工作。
    }
}