根据打印方法的结果,我想更改复选框的状态。如果打印机没有连接或找不到,我想处理它。现在,如果找不到打印机,即没有连接,我的代码就会抛出一个PInvokeStackImbalance Occured,如果我按下继续键,它就不会转到catch(异常ex)子句。我想要处理这个错误,不是为了获取catch子句,就是为了捕获这个PInvokeStackImbalance消息。下面是我的密码。
private void btnPrint_Click(object sender, EventArgs e)
{
if (txtPrinterName.Text == string.Empty)
{
MessageBox.Show("Enter a printer name");
return;
}
try
{
var mstrFullCutCode = (char)27 + (char)109;
_finalLength = noteToPrint;
var printingObject = new PrintClass.Class1.RawPrinterHelper();
var result = PrintClass.Class1.RawPrinterHelper.SendStringToPrinter(txtPrinterName.Text, _finalLength + mstrFullCutCode);
frmMain.Instance.LblStatus.Text = "Printer is found: " + result;
if ((bool)result)
{
frmMain.Instance.CbPrinter.Checked = true;
}
}catch(Exception ex)
{
frmMain.Instance.LblStatus.Text = "Error: " + ex.Message;
}
}这是托管调试助手的图像

发布于 2018-07-25 22:38:57
…如果我按下“继续”,它就不会转到我的catch(例外情况)子句。我想要处理这个错误,不是为了获取catch子句,就是为了捕获这个PInvokeStackImbalance消息。
我觉得你做不到。
虽然MDA看起来像一个未处理的异常,但它不是异常。例如,参见页面使用托管调试助理诊断错误上的第一个注意事项,其中部分内容是(重点添加的)…
如果在调试器不存在时引发MDA事件,则事件消息将显示在未处理的异常对话框中,尽管它不是未处理的异常。
PInvokeStackImbalance托管调试助手(MDA) “。因此,它通常表示PInvoke使用的托管签名中的错误,而不是缺少的打印机。
您应该检查您正在使用的本机方法的声明--很可能是OpenPrinter。
如果使用来自KB第322091条的KB第322091条类,请注意SendBytesToPrinter返回true或false以指示成功或失败,但SendStringToPrinter忽略该返回值并始终返回true。
SendStringToPrinter函数应该真正返回SendBytesToPrinter的结果,您的代码应该检查返回值,并调用GetLastWin32Error来获取有关故障的更多信息。您应该得到一个1801错误代码-打印机名称无效。
https://stackoverflow.com/questions/51510249
复制相似问题