2010-03-12 19 views
8

मैं प्रिंटर गुण खिड़की लाए बिना प्रिंटर गुण बदलने के लिए सक्षम होने के लिए चाहते हैं ...क्या प्रिंटर सेटिंग्स.GetHdevmode() में एक बग है?

DocumentProperties का उपयोग करना (Winspool.drv से आयात) समारोह अब तक, में नाकाम रही है, क्योंकि यह दबाने के लिए आसान है, जबकि संवाद दिखाने से, ऐसा लगता है कि प्रिंटरसेटिंग द्वारा वापस दिया गया मान। GetHdevmode() प्रिंटर सेटिंग्स को प्रतिबिंबित नहीं कर रहा है जो इसे कॉल कर रहा है, लेकिन इसके बजाय पिछले प्रिंटर गुणों का मान ठीक से लौट रहा है। उदाहरण के लिए, यह मेरे देता गुणों के आखिरी कॉल से पिछले (गलत) मान, मान के स्थान पर यह PrinterSettings से होना चाहिए वस्तु:

IntPtr hdevmode = PrinterSettings.GetHdevmode(PrinterSettings.DefaultPageSettings); 
PrinterSettings.SetHdevmode(hdevmode); 
PrinterSettings.DefaultPageSettings.SetHdevmode(hdevmode); 

तो करता GetHdevmode एक बग है या यह है कि क्या अपने ऐसा करने वाला? क्या इसके लिए सी # काम है या क्या किसी के पास इसके बारे में कोई जानकारी है? मुझे विषय पर जानकारी खोजने के लिए भी कठोर दबाव डाला गया है।

किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।

संपादित करें: मैं इसे किसी समस्या का व्यक्तिगत बनाना नहीं चाहता था, लेकिन उम्मीद है कि इस मामले में सभी जानकारी एक उत्तर प्रदान कर सकती है जो दूसरों के लिए भी उपयोगी समाधान है।

यहां एक सी ++ डीएलएल है जिसे मैंने इस मुद्दे के लिए कामकाज करने के लिए लिखा है। यह वर्तमान में काम नहीं कर रहा है - यह प्रतियों जैसे अन्य स्मृति को बदलता है, और "अंतर्निहित" पेपरसाइज़ को बदलने में सफल नहीं होता है। मैंने सोचा कि मुझे बस इतना करने की ज़रूरत है कि परिवर्तन करने के लिए आउट बफर फ्लैग निर्दिष्ट करें?

extern "C" __declspec(dllexport) DEVMODE* __stdcall GetRealHDevMode(int width, int height, char *printerName, DEVMODE* inDevMode) 
    { 
//declare handles and variables 
HANDLE printerHandle; 
LPHANDLE printerHandlePointer(&printerHandle); 

//get printer handle pointer 
OpenPrinter((LPWSTR)printerName, printerHandlePointer, NULL); 

//Get size needed for public and private devmode data and declare devmode structure 
size_t devmodeSize = DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, NULL, NULL, 0); 
DEVMODE* devmode = reinterpret_cast<DEVMODE*>(new char[devmodeSize + sizeof(DEVMODE) + sizeof(inDevMode->dmDriverExtra)]); 

//lock memory 
GlobalLock(devmode); 

//fill the out buffer 
DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, devmode, NULL, DM_OUT_BUFFER); 

//change the values as required 
devmode->dmPaperWidth = width; 
devmode->dmPaperLength = height; 
devmode->dmPaperSize = DMPAPER_USER; 

devmode->dmFields &= ~DM_PAPERSIZE; 
devmode->dmFields &= ~DM_PAPERLENGTH; 
devmode->dmFields &= ~DM_PAPERWIDTH; 
devmode->dmFields |= (DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH); 

//input flag on now to put the changes back in 
DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER); 

//unlock memory 
GlobalUnlock(devmode); 

//return the devmode that was used to alter the settings 
return devmode; 
    } 

मैं लगा सी ++ कोड सेटिंग में बदलाव करने के लिए पर्याप्त था, इसलिए सब मैं सी # में क्या यह है:

public PrinterSettings ChangePrinterProperties(PrinterSettings inPrinterSettings) 
    { 
     IntPtr TemphDevMode = inPrinterSettings.GetHdevmode(inPrinterSettings.DefaultPageSettings); 
     IntPtr hDevMode = GetRealHDevMode((int)(inPrinterSettings.DefaultPageSettings.PaperSize.Width * 2.54F), 
      (int)(inPrinterSettings.DefaultPageSettings.PaperSize.Height * 2.54F), 
      inPrinterSettings.PrinterName, TemphDevMode); 
     GlobalFree(hDevMode); 
     return inPrinterSettings; 
    } 

अद्यतन: अप आदेश dmPaperSize और dmFields साथ थोड़ा बदल दिया है। बेहतर परिणाम; अभी तक काफी नहीं है।

अद्यतन 2: ठीक है, मुझे एक माइक्रोसॉफ्ट पेज मिला जो कहता है कि दस्तावेज गलत है। एमएसडीएन कहते हैं कि जब आप चौड़ाई और ऊंचाई निर्दिष्ट करना चाहते हैं तो dmPaperSize को 0 पर सेट करना है, जबकि Microsoft समर्थन सुधार इसे DMPAPER_USER पर सेट करने के लिए कहता है। http://support.microsoft.com/kb/108924

+0

मैं सी ++ का उपयोग करता हूं। अधिकांश 'DEVMODE' संरचना से संबंधित मुद्दों को मैं या तो से संबंधित हूं 1) समस्याएं पढ़ें - संरचना तक पहुंचने से पहले स्मृति को लॉक नहीं करना या 2) समस्याएं लिखें - 'DEVMODE' सेट करते समय एक नई संरचना नहीं बनाते। HTH। – dirkgently

+0

आपका कोड स्निपेट कोई समझ नहीं लेता है, यह पहले से मौजूद था जो वापस रखता है।एक डिफ़ॉल्ट प्रिंटर चयन समस्या की तरह बदबू आ रही है, लेकिन दी गई जानकारी से कोई सुराग नहीं है। समस्या को बेहतर तरीके से समझाने में आपकी सहायता के लिए अधिक कोड पोस्ट करें या किसी और से पूछें। –

+0

@nobugz: बिल्कुल बिंदु ... इसे सिर्फ वहां वापस डालना चाहिए, लेकिन इसके बजाय यह एक अलग मान देता है, जो इसे बनाने के लिए प्रयुक्त प्रिंटर सेटिंग्स ऑब्जेक्ट को प्रतिबिंबित नहीं करता है, बल्कि प्रिंटर गुणों के लिए अंतिम कॉल को प्रतिबिंबित करता है। यह एक डिफ़ॉल्ट प्रिंटर समस्या नहीं है (यह बोर्ड भर में है)। @dirkgently: मैंने एक सी ++ डीएलएल लिखने की कोशिश की, लेकिन यह बदलने के लिए मैं कोशिश कर रहा था इसके अलावा अन्य स्मृति बदलना समाप्त हो गया। यह सुनिश्चित नहीं था कि मैं क्या गलत कर रहा था, लेकिन ऐसा लगता है जैसे मुझे मेमोरी-लॉकिंग समाधान देखना चाहिए। सलाह के लिये धन्यवाद। :) – Brandi

उत्तर

2

जिस तरह से आप DEVMODE में पेपर आकार को निर्दिष्ट कर रहे हैं के साथ 2 समस्याएं हैं:

(1) आप DM_PAPERWIDTH या DM_PAPERLENGTH या दोनों निर्दिष्ट करते हैं, आप भी DM_PAPERSIZE सा नहीं सेट करना होगा। यह प्रिंटर ड्राइवर पर निर्भर करता है, लेकिन कई ड्राइवर उपरोक्त कोड में DM_PAPERLENGTH/WIDTH को अनदेखा करेंगे।

(2) कई ड्राइवर DM_PAPERLENGTH/WIDTH का समर्थन नहीं करते हैं। ऐसे ड्राइवरों के साथ, आप पेपर आकार को सेट नहीं कर सकते जैसे आप ऊपर करने की कोशिश कर रहे हैं। आप केवल पूर्वनिर्धारित dmPaperSizes में से एक का चयन कर सकते हैं।

आप यह निर्धारित करने के लिए डिवाइस कैपेबिलिटीज (DC_FIELDS) का उपयोग कर सकते हैं कि आपका ड्राइवर DM_PAPERLENGTH/WIDTH का समर्थन करता है या नहीं।

आप स्वीकार्य dmPaperSizes को गिनाने के लिए डिवाइसकैबिलिटीज (DC_PAPERS) का उपयोग कर सकते हैं।

+0

मुझे लगता है कि इसने मुझे सही रास्ते पर सेट किया है ... हालांकि एमएसडीएन dmPaperSize को शून्य पर सेट करने के लिए कहता है: http://msdn.microsoft.com/en-us/library/ms896928.aspx – Brandi

+0

अपडेट: मुझे यह मिला: http://support.microsoft.com/kb/108924 जो कहता है 0 सही मान नहीं है। – Brandi

संबंधित मुद्दे