سؤال

لدي تطبيق WinForms الذي يولد كائن PrintDocument الخاص به للطباعة. إنه يعمل بشكل جيد في XP و Windows 7 مع اختباري الخاص، لكن مستخدم واحد قد حصل على الاستثناء التالي في نظام التشغيل Vista عند تحديد أمر الطباعة بمستند مفتوح:

************** Exception Text **************
System.ArgumentException: Handle 0 is not valid.
   at System.Drawing.Printing.PrinterSettings.SetHdevmode(IntPtr hdevmode)
   at System.Windows.Forms.PrintDialog.UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, Int16 copies, Int32 flags, PrinterSettings settings, PageSettings pageSettings)
   at System.Windows.Forms.PrintDialog.ShowPrintDialog(IntPtr hwndOwner, WndProc hookProcPtr, PRINTDLG data)
   at System.Windows.Forms.PrintDialog.RunDialog(IntPtr hwndOwner)
   at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
   at System.Windows.Forms.CommonDialog.ShowDialog()
   at Deck_Studio.DSMain.PrintDeck(Object sender, EventArgs e)
   at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.MenuItem.MenuItemData.Execute()
   at System.Windows.Forms.Command.Invoke()
   at System.Windows.Forms.Command.DispatchID(Int32 id)
   at System.Windows.Forms.Control.WmCommand(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

أواجه صعوبة في التفكيك من طبيعة هذا الخطأ وأي طرق محتملة لتكرار هذا. يعد البيان على الملف القابل للتنفيذ في وضع الأذونات "المحدودة" وحتى إجراء المستخدم تشغيل التطبيق كمسؤول ينشئ الخطأ.

هل كانت مفيدة؟

المحلول

تأكد من تحديد طابعة افتراضية. لقد قمت بتشغيل الكثير من الأخطاء المرتبطة بالطابعة غير الموقعية التي كانت ناتجة في النهاية عن عدم وجود طابعة افتراضية.

نصائح أخرى

لدي هذا الخطأ بعد استخدام Obfuscator. (لكن لم يضبط أي رمز حول الطباعة.)

بعد حفر بعض كود .Net إلخ. لقد وجدت حلا:

ما عليك سوى إضافة رمز وهمية يقرأ إعدادات الطابعة للكمبيوتر الحالي، قبل عرض أي printdialog وما إلى ذلك.

هنا هو الكود الذي أوصي به:

Console.Write(PrintSettings.InstalledPrinters);

أعتقد أن هذا هو .NET أو علة Windows.

كان لدي خطأ مماثل للغاية:

    Error Description: Handle 0 is not valid.

Error Stack Trace:
   at System.Drawing.Printing.PrinterSettings.SetHdevmode(IntPtr hdevmode)
   at System.Windows.Forms.PrintDialog.UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, Int16 copies, Int32 flags, PrinterSettings settings, PageSettings pageSettings)
   at System.Windows.Forms.PrintDialog.ShowPrintDialog(IntPtr hwndOwner, WndProc hookProcPtr, PRINTDLG data)
   at System.Windows.Forms.PrintDialog.RunDialog(IntPtr hwndOwner)
   at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
   at System.Windows.Forms.CommonDialog.ShowDialog()

تحولت المشكلة إلى أن برنامج تشغيل الطباعة كان معيبا. بعد إعادة تثبيتها عملت بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top