vb.net 调用api的 问题

terranghost 2006-11-09 08:24:29
Imports System.Diagnostics.Debug
Imports System.Drawing.Printing
Imports System.Runtime.InteropServices
Imports System.Drawing.Printing.PrinterSettings


Public Class Form1
Inherits System.Windows.Forms.Form
'Define the printer status constants.
Public Const ERROR_INSUFFICIENT_BUFFER = 122
Public Const PRINTER_STATUS_BUSY = &H200
Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
Public Const PRINTER_STATUS_ERROR = &H2
Public Const PRINTER_STATUS_INITIALIZING = &H8000
Public Const PRINTER_STATUS_IO_ACTIVE = &H100
Public Const PRINTER_STATUS_MANUAL_FEED = &H20
Public Const PRINTER_STATUS_NO_TONER = &H40000
Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
Public Const PRINTER_STATUS_OFFLINE = &H80
Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
Public Const PRINTER_STATUS_PAPER_JAM = &H8
Public Const PRINTER_STATUS_PAPER_OUT = &H10
Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
Public Const PRINTER_STATUS_PAUSED = &H1
Public Const PRINTER_STATUS_PENDING_DELETION = &H4
Public Const PRINTER_STATUS_PRINTING = &H400
Public Const PRINTER_STATUS_PROCESSING = &H4000
Public Const PRINTER_STATUS_TONER_LOW = &H20000
Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
Public Const PRINTER_STATUS_WAITING = &H2000
Public Const PRINTER_STATUS_WARMING_UP = &H10000
'Define the job status constants.
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
Public Const JOB_STATUS_RESTART = &H800
Public Const PRINTER_ACCESS_ADMINISTER = &H4
Public Structure PRINTER_DEFAULTS
Public pDatatype As String
Public pDevMode As Integer
Public DesiredAccess As Integer
End Structure
Public Class WINAPI

Declare Auto Function GetPrinter Lib "winspool.drv" (ByVal hPrinter As _
IntPtr, ByVal Level As Integer, ByRef pPrinter As Byte, ByVal cbBuf _
As Integer, ByRef pcbNeeded As Integer) As Boolean

Declare Auto Function lstrcpy Lib "Kernel32.Lib" Alias "lstrcpyA" _
(<OutAttribute(), MarshalAs(UnmanagedType.LPStr)> ByVal lpString1 As String, _
<MarshalAs(UnmanagedType.LPStr)> ByVal lpString2 As String) As Long

Declare Auto Function ClosePrinter Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter As IntPtr) As Long
Public Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" _
(ByVal hPrinter As IntPtr, _
ByVal FirstJob As Int32, _
ByVal NoJobs As Int32, _
ByVal Level As Int32, _
ByVal pJob As Byte(), _
ByVal cdBuf As Int32, _
ByRef pcbNeeded As Int32, _
ByRef pcReturned As Int32) _
As Long

Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, _
ByRef phPrinter As Integer, ByVal pDefault As PRINTER_DEFAULTS) As IntPtr
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim PD As New PrintDocument
Dim PrinterName As String
Dim result As IntPtr
Dim hPrinter As Integer
Dim ppd As PRINTER_DEFAULTS
ppd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
ppd.pDatatype = 0
ppd.pDevMode = 0
PrinterName = PD.PrinterSettings.PrinterName
result = WINAPI.OpenPrinter(PrinterName, hPrinter, ppd)
MsgBox(PrinterName)
End Sub
End Class


检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“printlog1!printlog.Form1+WINAPI::OpenPrinter”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。







我到网上找资料说是 类型不匹配 我改了半天了不行
...全文
154 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
KahnWinsock 2006-11-11
  • 打赏
  • 举报
回复
把API声明中的Long都改成Integer试试。

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧