【问题标题】:Dllcall autoit partially getting resultsDllcall autoit 部分获得结果
【发布时间】:2011-04-05 08:59:17
【问题描述】:

我在 autoit 中遇到以下代码问题。

假设列出我系统中可用的所有打印机以及每台打印机支持的相应纸张名称。

但我只得到打印机名称和一系列“0”,这应该是纸张名称

#include <Debug.au3>
#include <String.au3>
Const $DC_BINS = 6
Const $DC_BINNAMES = 12
Const $DC_PAPERNAMES = 16
Const $DC_PAPERS = 2
Const $DC_PAPERSIZE = 3
Dim $BinNameList
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colInstalledPrinters = $objWMIService.ExecQuery ("Select Name, PortName from Win32_Printer")
For $objPrinter In $colInstalledPrinters
    $result = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERS, "str", Chr(0), "long", 0)
    $s_struct = ""
_DebugSetup ($s_struct)
    $s_struct=_StringRepeat("0", $result[0]*64)
    ;$s_struct = StringTrimRight($s_struct, 1)
    $struct = DllStructCreate($s_struct)
    $result2 = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERNAMES, "ptr", DllStructGetPtr($struct), "long", 0)
    _DebugOut ( $objPrinter.Name) 
    For $i = 0 To $result[0]-1
        _DebugOut (DllStructGetData($struct, $i)) 
    Next
    $struct = 0
Next

【问题讨论】:

    标签: autoit printers


    【解决方案1】:

    看看这个:http://msdn.microsoft.com/en-us/library/aa394363(v=vs.85).aspx

    仅使用 WMI 的示例:

    #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
    

    或者试试这个打印实际的论文名称(在 SciTE 中运行,这样你就可以看到 ConsoleWrite 的输出):

    Const $DC_PAPERS = 2
    Const $DC_PAPERSIZE = 3
    Const $DC_PAPERNAMES = 16
    
    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    $colInstalledPrinters = $objWMIService.ExecQuery ("Select Name, PortName from Win32_Printer")
    
    For $objPrinter In $colInstalledPrinters
        $result = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERS, "str", Chr(0), "long", 0)
    
        $s_struct = ""
        $s_struct2 = ""
    
        For $i = 1 To $result[0]
            $s_struct = $s_struct & "char[64];"
        Next
    
        For $i = 1 To $result[0]
            $s_struct2 &= "long x;long y;"
        Next
    
        $s_struct = StringTrimRight($s_struct, 1)
        $s_struct2 = StringTrimRight($s_struct2, 1)
        $j = 1
    
        $struct = DllStructCreate($s_struct)
        $pointStruct = DllStructCreate($s_struct2)
    
        $result2 = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERNAMES, "ptr", DllStructGetPtr($struct), "long", 0)
        $result3 = DllCall("winspool.drv", "long", "DeviceCapabilitiesA", "str", $objPrinter.Name, "str", $objPrinter.PortName, "int", $DC_PAPERSIZE, "ptr", DllStructGetPtr($pointStruct), "long", 0)
    
        ConsoleWrite($objPrinter.Name & " on Port: " & $objPrinter.PortName & @CRLF)
        For $i = 1 To $result[0]
            ConsoleWrite(DllStructGetData($struct, $i) & " (" & DllStructGetData($pointStruct, $j) & "mm x " & DllStructGetData($pointStruct, $j + 1) & "mm)" & @CRLF)
            $j += 2
        Next
    
        $struct = 0
        $pointStruct = 0
    Next
    

    【讨论】:

    • 非常感谢您的回复,但它不会返回实际的纸张大小,而是返回类似 1,1,1,1,7,24,23,1,1 的东西, 1,1,1,8 等不是实际的纸张尺寸
    • 在我发送给您的 msdn 页面上,它描述了这些数字的用途。例如,8 表示 A3 格式。实际上,我还有另一个答案可以打印实际名称,它基本上可以按照您在第一篇文章中所说的那样做。我将编辑我的答案并将其发布。
    猜你喜欢
    • 2022-10-19
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2020-01-07
    相关资源
    最近更新 更多