我有我想要在 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