2009-07-07 7 views
1

J'ai une application Winforms qui génère son propre objet PrintDocument pour l'impression. Il fonctionne très bien dans XP et Windows 7 avec mes propres tests, mais un utilisateur a été faire l'exception suivante dans Vista quand ils choisissent la commande d'impression avec un document ouvert:Erreur bizarre impression objet PrintDocument dans .NET

************** 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) 

Je suis un moment difficile assemblant la nature de cette erreur et les moyens potentiels de la dupliquer. Le manifeste sur l'exécutable est dans le mode d'autorisation "limité" et même l'exécution de l'application en tant qu'administrateur par l'utilisateur génère l'erreur.

+0

Il semble que le pilote d'impression ne se comporte pas (première estimation). Est-ce que cela arrive avec toutes les imprimantes sur l'ordinateur de cet utilisateur? –

+0

Ils ont essayé leur stiller Adobe, écrivain XPS et imprimante de base et ont obtenu l'erreur. –

+0

Donc, il ne semble pas être une imprimante spécifique en faute. Et ce n'est pas un problème d'autorisations. Si ce n'est pas un problème d'O/S (c'est-à-dire l'essayer sur un autre bureau en utilisant Vista), je devrais aller avec la réponse de MusiGenesis: imprimante par défaut non définie. –

Répondre

6

Assurez-vous que l'imprimante par défaut est sélectionnée. J'ai rencontré beaucoup de bogues erratiques liés aux imprimantes qui n'ont finalement pas été causés par une imprimante par défaut.

+0

Oui, je parie que c'est tout. –

+0

Comment définir une imprimante par défaut? – colmde

+1

@colmde: Je suppose que vous voulez dire que la boîte de dialogue de sélection de l'imprimante ne vous permet pas de sélectionner "pas d'imprimante"? Vous devrez probablement modifier le registre manuellement afin de ramener votre ordinateur à l'état d'imprimante par défaut. Ou peut-être supprimer toutes vos imprimantes le ferait. Désolé je ne peux pas vous aider, je n'ai pas de Windows en cours d'exécution pour le moment (OSX pour moi maintenant). – MusiGenesis

2

J'ai cette erreur après avoir utilisé un obfuscator. (Mais n'a pas obscurcir un code sur l'impression.)

Après avoir creusé un code .NET, etc. décompilé que j'ai trouvé une solution:

il suffit d'ajouter un code fictif qui lit les paramètres de l'imprimante de l'ordinateur en cours, avant d'afficher une PrintDialog etc.

Voici le code que je recommande:

Console.Write(PrintSettings.InstalledPrinters); 

Je pense que c'est un .NET ou un bug de Windows.

2

J'ai eu une erreur très similaire:

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() 

Le problème avéré être que le pilote d'impression était défectueux. Après avoir réinstallé cela a bien fonctionné.