请教关于“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的问题

wsy2005wsy 2011-08-17 02:56:11
高手们好,我最近在做一个要用到条码打印机的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 工作。
}
}
...全文
2095 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tdskee 2011-08-17
  • 打赏
  • 举报
回复
我也遇到这个问题,我是在C#中调用c++的dll的时候,给初始化后的struct赋值的时候报的错,很奇怪啊!!!
子夜__ 2011-08-17
  • 打赏
  • 举报
回复
暖枫无敌 2011-08-17
  • 打赏
  • 举报
回复
可能是导入函数的返回值、参数类型声明不正确导致的。
Avoid 2011-08-17
  • 打赏
  • 举报
回复
凡是带有create函数都放外面来,第二次进去不要执行

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧