Office VBA 64 中的枚举作业 API DLL 调用

问题描述 投票:0回答:0

我有我想要在 Office VBA7 64 位中工作的 32 位代码。

目的是检查打印机状态。

我最初使用此代码,将其嵌入到我的应用程序中。
获取网络上指定打印机的等待作业数

我检查了 Pinvoke.net 上的 defs Pinvoke.net 上的 C++ defs

我用 PtrSafe 调整了我的定义,并且所有编译和运行都在 64 位上。

我知道 VB.net 中的 IntPtr 100% 等同于 VBA7 中的 LongPtr。这就是我尝试过的各种组合。

我从 enumjobs 调用中得到“0 个作业”,或者当我更改 DLL 调用定义时崩溃。
我怀疑某些参数定义必须适应 Any 或 LongPtr,但从哪里开始呢?

我使用的定义:

Option Explicit

Declare PtrSafe Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
    (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long

Declare PtrSafe Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Declare PtrSafe Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" _
    (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, _
    ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, _
    pcbNeeded As Long, pcReturned As Long) As Long

Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, _
    Source As Any, _
    ByVal Length As Long)

Declare PtrSafe Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
    (lpString1 As Any, _
    lpString2 As Any) As Long

Type SYSTEMTIME
  wYear     As Integer
  wMonth    As Integer
  wDayOfWeek  As Integer
  wDay     As Integer
  wHour     As Integer
  wMinute    As Integer
  wSecond    As Integer
  wMilliseconds As Integer
End Type

Type JOB_INFO_1
  JobId    As Long
  pPrinterName As Long
  pMachineName As Long
  pUserName  As Long
  pDocument  As Long
  pDatatype  As Long
  pStatus   As Long
  Status    As Long
  Priority   As Long
  Position   As Long
  TotalPages  As Long
  PagesPrinted As Long
  Submitted  As SYSTEMTIME
End Type

Public Const JOB_STATUS_PAUSED = &H1
Public Const JOB_STATUS_ERROR = &H2
Public Const JOB_STATUS_DELETING = &H4
Public Const JOB_STATUS_SPOOLING = &H8
Public Const JOB_STATUS_PRINTING = &H10
Public Const JOB_STATUS_OFFLINE = &H20
Public Const JOB_STATUS_PAPEROUT = &H40
Public Const JOB_STATUS_PRINTED = &H80
Public Const JOB_STATUS_DELETED = &H100
Public Const JOB_STATUS_BLOCKED_DEVQ = &H200
Public Const JOB_STATUS_USER_INTERVENTION = &H400  ' Windows 95 Only

Public Const NO_PRIORITY = 0
Public Const MAX_PRIORITY = 99
Public Const MIN_PRIORITY = 1
Public Const DEF_PRIORITY = 1
32bit-64bit vba7 windows-api-code-pack
© www.soinside.com 2019 - 2024. All rights reserved.