Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Finished Printing notification

Îåêßíçóå áðü ôï ìÝëïò anjelinio. Τελευταία δημοσίευση από το μέλος manosB στις 05-02-2008, 14:57. Υπάρχουν 23 απαντήσεις.
Σελίδα 1 από 2 (24 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-09-2007, 11:08 35374

    Finished Printing notification

    Χρειάζομαι να κάνω το εξής - αφού στείλω ένα έγγραφο για printing σε ένα printer ( τοπικό ή shared printer στο δίκτυο ), θέλω κάπως να ξέρω ότι η εκτύπωση τελείωσε. Όχι όμως το spooling, η εκτύπωση !

    Καμμιά ιδέα για το προς τα πού να κοιτάξω;

    Πολύ καλή μέρα μας ...

    Angel
    O:]
  •  25-09-2007, 12:52 35382 σε απάντηση της 35374

    Απ: Finished Printing notification

    Μια ιδέα, χωρίς να είμαι απολύτως σίγουρος ότι δουλεύει.
    Χρησιμοποίησε το API των Windows για να τσεκάρεις το availability του εκτυπωτή. Δες την OpenPrinter και ClosePrinter από εκεί.

    Manos
  •  25-09-2007, 14:36 35388 σε απάντηση της 35382

    Απ: Finished Printing notification

    Μήπως ξέρεις σε ποιό Dll θα τις βρώ; ( Για να κάνω το σωστό DllImport )

    Στο API reference του MSDN, μου λέει ότι είναι ορισμένο στο Winspool.lib, αλλά δεν υπάρχει κάποιο αντίστοιχο Dll ...

    Angel
    O:]
  •  25-09-2007, 15:11 35390 σε απάντηση της 35388

    Απ: Finished Printing notification

    Winspool.drv ... at last ! :D

    Angel
    O:]
  •  25-09-2007, 15:41 35391 σε απάντηση της 35390

    Απ: Finished Printing notification

    yeap είναι το Winspool.drv

    Σε παρακαλώ αν δουλέψει κάνε μια δημοσίευση διότι ενώ της χρησιμοποιώ δεν ξέρω αν βοηθούν σε τέτοιες καταστάσεις.

    Manos
  •  25-09-2007, 15:53 35394 σε απάντηση της 35391

    Απ: Finished Printing notification

    ΌΠΩΣΔΗΠΟΤΕ ΘΑ ΓΊΝΕΙ POST ΑΝ ΠΟΤΕ ΠΑΙΞΕΙ !!!

    ... αλλά τώρα έχουμε νέο πρόβλημα. Πώς τις δηλώνω ο καημένος μετά το DllImport ? οκ, η OpenPrinter ήταν εύκολη, και μου έπαιξε μια χαρά και με τη μία, αλλά για να πάρω το τρέχον status του Printer, πρέπει να καλέσω την GetPrinter με τις "κατάλληλες" παραμέτρους, για να μου επιστρέψει ένα structure απο το οποίο θα διαβάσω την τιμή που χρειάζομαι.

    Καλά όλα αυτά, αλλά ...

    BOOL GetPrinter(
    HANDLE
    hPrinter, // handle to printer
    DWORD Level, // information level
    LPBYTE pPrinter, // printer information buffer
    DWORD cbBuf, // size of buffer
    LPDWORD pcbNeeded // bytes received or required
    );
    και "μεταφράζω" εγώ ... πιθανώς αποτυχημένα ...

    [DllImport("Winspool.drv")]
    static extern Boolean GetPrinter(IntPtr ptrHandle, UInt32 level, ref byte[] buffer, UInt32 bufferSize, out UInt32 bufferSizeRequired);

    ... και χρησιμοποιώ - εξίσου αποτυχημένα Big Smile ...

                IntPtr printerHandle;
                // ok, let's try to open the printer first ...
                if(OpenPrinter(printerName, out printerHandle, IntPtr.Zero)){
                    // cool .. now I can somehow call the GetPrinter method ... and check that buffer value out, to get the status value ... :S
                    // e re filo pou mpleksame ...
                    UInt32 reqSize;
                    UInt32 bufferSize = 32;
                    UInt32 level = 6; // defines a PRINTER_INFO_6 struct as the resulting type - the version that has my status value ...
                    byte[] buffer = new byte[32];

                    if(GetPrinter(ref printerHandle, level, ref buffer, bufferSize, out reqSize)){
                        Console.WriteLine("Got Status as bute array");
                    }else {
                        Console.WriteLine("BufferSize Required: {0}", reqSize);
                    }
                }

    ... όλο αυτό το μακρυνάρι του GetPrinter λοιπόν μου επιστρέφει false, και αν και λέει στο MSDN ότι αν το λάθος είναι στο buffer size θα μου γεμίσει την reqSize με το size που χρειάζεται, του δίνει την τιμή 0. Μάλλον λοιπόν κάπου αλλού είναι το λάθος μου, αλλά .. πού;;; Data types στις παραμέτρους μάλλον; Ή μπορεί να έχω μπλέξει τα ref με τα out και τούμπαλιν Smile

    ... τα αυγά και τα πασχάλια μάλλον  Big Smile




    Angel
    O:]
  •  25-09-2007, 16:31 35397 σε απάντηση της 35394

    Απ: Finished Printing notification

    Γιατί παιδεύεις την ζωή σου έτσι; Πήγαινε στο www.pinvoke.net έχει ότι χρειάζεσαι απο PInvoke syntax και requests. Wink Αμα "μάθεις" μια απο εκεί τα σωστά, μετά θα σου φαίνεται παιχνιδάκι να βγάλεις σωστό syntax. Και θα βρεις ότι θέλεις εκεί για το OpenPrinter κλπ, οπότε δεν σου κάνω ποστ δικό μου κώδικα.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  25-09-2007, 16:51 35398 σε απάντηση της 35394

    Απ: Finished Printing notification

    Φτιάξε μια assembly σε managed C++ και βάλε μέσα τα Win32 calls να βρεις την υγειά σου. It Just Works Interop χωρίς να παιδεύεσαι με P/Invoke και άλλους τέτοιους δαίμονες.


    Νατάσα Μανουσοπούλου
  •  25-09-2007, 16:57 35399 σε απάντηση της 35398

    Απ: Finished Printing notification

    lol ... spoken like a true C++ dev ... αλλά δυστυχώς έχω να γράψω C++ καμμιά 7-ετία, οπότε ... άστα να πάνε. Ανοίγω καμμιά φορά τη Visual C++ απλώς για να νιώσω ... inadequate Big Smile

    Angel
    O:]
  •  25-09-2007, 17:18 35402 σε απάντηση της 35398

    Απ: Finished Printing notification

    Νατάσα Μανουσοπούλου:

    Φτιάξε μια assembly σε managed C++ και βάλε μέσα τα Win32 calls να βρεις την υγειά σου. It Just Works Interop χωρίς να παιδεύεσαι με P/Invoke και άλλους τέτοιους δαίμονες.

    Ε όχι και δαίμονες.. Μια χαρά δουλεύουν.. λίγο να συνηθίσεις το syntax θέλει!


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  25-09-2007, 17:23 35403 σε απάντηση της 35399

    Απ: Finished Printing notification

    οκ, μετά απο λίγο ψάξιμο στο PInvoke.net, κατέληξα στις παρακάτω 2 definitions:

    [DllImport("winspool.Drv", EntryPoint = "GetPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
                 ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            private static extern bool GetPrinter(IntPtr hPrinter, Int32 dwLevel,
                IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded);

            [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
                 ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter,
                out IntPtr hPrinter, IntPtr printerDefaults);

    ... οι οποίες παίζουν μια χαρά στον παρακάτω κώδικα, αλλά μόνο αν περάσω "level" param στην GetPrinter την τιμή  2 ... αλλά εγώ ο δυστυχής χρειάζομαι την τιμή 6 κατα τα λεγόμενα του MSDN. Στον κώδικα παρακάτω, το πρώτο call στην GetPrinter παίζει μια χαρούλα, μου επιστρέφει τα required bytes. Αν το 2 το αλλάξω σε 6 ... τότε εκτελείται πάλι, τα required bytes είναι πάντα 0 και το Marshal.GetLastError() μου επιστρέφει success τιμή (124) ...

    public static void GetPrinterStatus(string printerName)
            {
                IntPtr printerHandle;
                // ok, let's try to open the printer first ...
                if (OpenPrinter(printerName, out printerHandle, IntPtr.Zero))
                {
                    // ok, now ... I'm doin' this 2 times. The first i do just to fail & get back the required bytes for my
                    // buffer length
                    int bytesRequired;
                    int intJunk;
                   
                    GetPrinter(printerHandle, 2, IntPtr.Zero, 0, out bytesRequired);
                    if (bytesRequired <= 0) {
                        int lastError = Marshal.GetLastWin32Error();
                        Marshal.ThrowExceptionForHR(lastError);

                        throw new ApplicationException(string.Format("Invalid error code: {0}", lastError));
                    }
                   
                    // ok, bytes required is NOT 0 ... proceed then
                    IntPtr ptrPrinterInfo = Marshal.AllocCoTaskMem(bytesRequired);
                    if (GetPrinter(printerHandle, 6, ptrPrinterInfo, bytesRequired, out intJunk)) {
                        // Get a var ready ...
                        PRINTER_INFO_6 pInfo = (PRINTER_INFO_6)Marshal.PtrToStructure(ptrPrinterInfo, typeof(PRINTER_INFO_6));
                        // and deserialize off the memory buffer, innit ???
                        Console.WriteLine("Fetched DWORD: {0}", pInfo.dwStatus);
                    }

                    // Close the printer ...
                    ClosePrinter(printerHandle);
                }
            }

    ... ε, ρε που μπλέξαμε πάλι στην κωδικο-χώρα, επειδή κάποιος δε θέλει να πατήσει ένα button όταν πάρει στα χέρια του την εκτύπωση απο τον εκτυπωτή που έχει δίπλα του Tongue Tied

    Νεότερα ... όταν έχω Big Smile

    Angel
    O:]
  •  25-09-2007, 17:28 35405 σε απάντηση της 35403

    Απ: Finished Printing notification

    ... ή είμαι απλώς πόντιος - no pun intended - γιατί η PRINTER_INFO_2 έχει και το status μέσα ...

    Angel
    O:]
  •  25-09-2007, 17:53 35407 σε απάντηση της 35405

    Απ: Finished Printing notification

    anjelinio:
    ... ή είμαι απλώς πόντιος

    εεεεε ψιτ!!!!!!!
    Λίγα για τους πόντιους Stick out tongue

    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  25-09-2007, 19:21 35411 σε απάντηση της 35407

    Απ: Finished Printing notification

    "Καράμπα, κανάγια" έλεγε ο Ντάλτον ... σε δικτυακό εκτυπωτή πάντα το status value είναι ... 0.

    Plan B: .. το status του print job Tongue Tied ... "καταταχτείτε μας έλεγαν" ...

    Angel
    O:]
  •  25-09-2007, 19:58 35414 σε απάντηση της 35411

    Απ: Finished Printing notification

    anjelinio:
    "Καράμπα, κανάγια" έλεγε ο Ντάλτον ... σε δικτυακό εκτυπωτή πάντα το status value είναι ... 0.

    Plan B: .. το status του print job Tongue Tied ... "καταταχτείτε μας έλεγαν" ...


    Φίλε είμαστε μαζί σου, έμπαινε και μην φοβάσαι τίποτα!!!!! Yes

    Manos
Σελίδα 1 από 2 (24 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems