Sign in to follow this  
Followers 0

help Printer papernames and papersizes

7 posts in this topic

Posted (edited)

AM trying to convert this code that retrieves printer papernames ans sizes from vb6 to autoit

Dim paperNumbers()      As Integer, paperSizes() As POINTAPI

lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERNAMES, ByVal vbNullString, 0)
    ReDim numPaper(1 To lPaperCount)
    sPaperNamesList = String(64 * lPaperCount, 0)
    ' Get paper names
    lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERNAMES, ByVal sPaperNamesList, 0)
    ' Get matching paper numbers
    ReDim paperNumbers(1 To lPaperCount)
    lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERS, paperNumbers(1), 0)
    ReDim paperSizes(1 To lPaperCount)
    lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERSIZE, paperSizes(1), 0)
    For lCounter = 1 To lPaperCount
        sNextString = Mid(sPaperNamesList, 64 * (lCounter - 1) + 1, 64)
        sNextString = Left(sNextString, InStr(1, sNextString, Chr(0)) - 1)
        List2.AddItem paperNumbers(lCounter) & vbTab _
            & Format(paperSizes(lCounter).x / 254, "0.00") & " x " _
            & Format(paperSizes(lCounter).y / 254, "0.00") _
            & " inch" & vbTab & sNextString
    Next lCounter

The auto it version

Dim $numPaper[$lPaperCount[0]]
 $lPaperCount = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERSIZE, "str", DllStructGetPtr($paperSizes), "ptr", 0)
    
    Dim $OutPut
    For $lCounter = 1 To $lPaperCount-1
        $sNextString = StringMid($sPaperNamesList, 64 * ($lCounter - 1) + 1, 64)
        $sNextString = stringLeft($sNextString, StringInStr($sNextString, Chr(0),1,1,1) - 1)
        $OutPut &= $paperNumbers($lCounter) & @Tab 
        $OutPut &= StringFormat("%10.2f",$paperSizes($lCounter).x / 254) & " x "
        $OutPut &= StringFormat("%10.2f",$paperSizes($lCounter).y / 254)  & " inch" & @tab & $sNextString @CRLF
    Next

I don't het anything in my output.

$paperSizes is suppose to be and array of points (x,y) retrieved from the dllcall

Edited by oghenez

Share this post


Link to post
Share on other sites



Posted

#include <Array.au3>

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colInstalledPrinters = $objWMIService.ExecQuery ("Select * from Win32_Printer",Default,48)
For $objPrinter In $colInstalledPrinters
    $arr = $objPrinter.PrinterPaperNames
    _ArrayDisplay($arr, $objPrinter.Name)
Next

Check out this too: http://stackoverflow.com/questions/5549476/dllcall-autoit-partially-getting-results

:)

Share this post


Link to post
Share on other sites

Posted (edited)

If your printers are network printers managed by a spool server you can get a lot of information about the print queues using my AD UDF, function _AD_ListPrintQueues and _AD_GetObjectProperties.

Edited by water

Share this post


Link to post
Share on other sites

Posted

#include <Array.au3>

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colInstalledPrinters = $objWMIService.ExecQuery ("Select * from Win32_Printer",Default,48)
For $objPrinter In $colInstalledPrinters
    $arr = $objPrinter.PrinterPaperNames
    _ArrayDisplay($arr, $objPrinter.Name)
Next

Check out this too: http://stackoverflow.com/questions/5549476/dllcall-autoit-partially-getting-results

:)

I tried this, but it dosen't return the actual paper sizes. it returns series of 1s. the paper sizes is suppose to be Xmm x Ymm

#include <Array.au3>

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colInstalledPrinters = $objWMIService.ExecQuery ("Select * from Win32_Printer",Default,48)
For $objPrinter In $colInstalledPrinters
    $arr = $objPrinter.PaperSizesSupported 
    _ArrayDisplay($arr, $objPrinter.Name)
Next

Share this post


Link to post
Share on other sites

Posted (edited)

help me get the names & sizes here, but am left with the papernumbers, please help me with the struct, thats where i get confused

in vb6 i can do this

Dim paperNumbers()  As Integer

and pass it to the api like this

' Get paper names
    lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERNAMES, ByVal sPaperNamesList, 0)
    ' Get matching paper numbers
    ReDim paperNumbers(1 To lPaperCount)
    lPaperCount = DeviceCapabilities(Printer.DeviceName, Printer.Port, DC_PAPERS, paperNumbers(1), 0)

in autoit i did this

but get the result posted at the buttom of that post

Edited by TheCurrent

Share this post


Link to post
Share on other sites

Posted (edited)

I tried this, but it dosen't return the actual paper sizes. it returns series of 1s. the paper sizes is suppose to be Xmm x Ymm

#include <Array.au3>

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colInstalledPrinters = $objWMIService.ExecQuery ("Select * from Win32_Printer",Default,48)
For $objPrinter In $colInstalledPrinters
    $arr = $objPrinter.PaperSizesSupported 
    _ArrayDisplay($arr, $objPrinter.Name)
Next

Yes, you need to translate the numbers yourself which is quite a simple job. Paper sizes is described on the page I linked you at: http://msdn.microsoft.com/en-us/library/aa394363(v=vs.85).aspx

For example I see my printer supports 8 which is A3. I know that it is 297x420 so I would make this code:

Switch $paperSizeType
   Case 8
      Return "A3 (297mm x 420mm)"
EndSwitch

The solution is not as good as the one MrMitchell gave you in the other thread, but when you say you "have been doing this for four days now by myself" doing this would mean that you were done 3 days ago.

Edited by Manadar

Share this post


Link to post
Share on other sites

Posted

what i meant by "have been doing this for four days now by myself" is that i have been trying to do it myself without success

By the way, how do i pass an array or int to dllcall and retrieve the result?

i tried this

$result = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERNAMES, "str", Chr(0), "long", 0)
;Create all the structures to retrieve the necessary values
$NumberStruct = ""
For $i = 1 To $result[0]
$NumberStruct &="int;"
Next
$NumberStruct = StringTrimRight($NumberStruct, 1)
$pNumberStruct = DllStructCreate($NumberStruct)
;Get paper Numbers
$result1 = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERS, "ptr", DllStructGetPtr($pNumberStruct), "long", 0)
For $i = 1 To $result[0]
ConsoleWrite(DllStructGetData($pNumberStruct, $i) & @CRLF)
Next

i got this

196609
327684
524295
4325385
11534511
11665585
11796659
11927733
12058807
12189881
12320955
12452029
12583103
12714177
12845251
12976325
13107399
13238473
13369547
2147418317
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

which is not complete or somthing. what am i doing wrong?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0