DOBON.NET DOBON.NETプログラミング掲示板過去ログ

APIで用紙を変更したい

分類:[.NET]

.NET  Visual Basic 2003
  Crystal Report XI
で開発を行っております。

PGごとに使用する用紙を変更したいと思い
APIを使おうと考えています。

API関数、OpenPrinter、GetPrinter、MoveMemory、SetPrinter、ClosePrinterを
使用するところまではわかりました。
しかし、参考にするコードなどがないため手間取っています。

どなたか使用方法などを知っていましたら教えてください。


' プリンタアクセス権を定義する構造体の宣言
Structure PRINTER_DEFAULTS
Dim pDatatype As Integer
Dim pDevMode As Integer
Dim DesiredAccess As Integer
End Structure

' 標準的な権利を要求することを示す定数の宣言
Public Const STANDARD_RIGHTS_REQUIRED As Integer = &HF0000
' プリンタアクセス権の管理者権限を示す定数の宣言
Public Const PRINTER_ACCESS_ADMINISTER As Integer = &H4
' プリンタアクセス権のユーザー権限を示す定数の宣言
Public Const PRINTER_ACCESS_USE As Integer = &H8
' プリンタアクセス権すべての権限を示す定数の宣言
Public Const PRINTER_ALL_ACCESS As Boolean = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

' プリンタのオブジェクトハンドルを取得する関数の宣言
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
( _
<MarshalAs(UnmanagedType.LPStr)> ByVal pPrinterName As String, _
ByRef phPrinter As IntPtr, _
ByVal pDefault As PRINTER_DEFAULTS) As Integer

' デバイス名の長さを示す定数の宣言
Public Const CCHDEVICENAME As Short = 32
' フォーム名の長さを示す定数の宣言
Public Const CCHFORMNAME As Short = 32

' 詳細なプリンタデバイス情報を定義する構造体の宣言
<StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
<MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmDeviceName As String
Public dmSpecVersion As Short
Public dmDriverVersion As Short
Public dmSize As Short
Public dmDriverExtra As Short
Public dmFields As Integer
Public dmOrientation As Short
Public dmPaperSize As Short
Public dmPaperLength As Short
Public dmPaperWidth As Short
Public dmScale As Short
Public dmCopies As Short
Public dmDefaultSource As Short
Public dmPrintQuality As Short
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmFormName As String
Public dmUnusedPadding As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
End Structure


' 用紙が有効であること示す定数の宣言
Public Const DM_PAPERSIZE As Integer = &H2
' 用紙を示す定数の宣言
Public Const DMPAPER_LETTER As Short = 1
Public Const DMPAPER_LETTERSMALL As Short = 2
Public Const DMPAPER_A3 As Short = 8
Public Const DMPAPER_A4 As Short = 9
Public Const DMPAPER_A4SMALL As Short = 10
Public Const DMPAPER_A5 As Short = 11
Public Const DMPAPER_B4 As Short = 12
Public Const DMPAPER_B5 As Short = 13
Public Const DMPAPER_NOTE As Short = 18
Public Const DMPAPER_JAPANESE_POSTCARD As Short = 43

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Structure PRINTER_INFO_2
Public pServerName As Integer
Public pPrinterName As Integer
Public pShareName As Integer
Public pPortName As Integer
Public pDriverName As Integer
Public pComment As Integer
Public pLocation As Integer
Public pDevMode As Integer
Public pSepFile As Integer
Public pPrintProcessor As Integer
Public pDatatype As Integer
Public pParameters As Integer
Public pSecurityDescriptor As Integer
Public Attributes As Integer
Public Priority As Integer
Public DefaultPriority As Integer
Public StartTime As Integer
Public UntilTime As Integer
Public Status As Integer
Public cJobs As Integer
Public AveragePPM As Integer
End Structure

' プリンタの詳細な情報を取得する関数の宣言
Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As _
IntPtr, ByVal Level As Integer, ByRef pPrinter As Byte, ByVal cbBuf _
As Integer, ByRef pcbNeeded As Integer) As Boolean

' ある位置から別の位置にメモリブロックを移動する関数の宣言
Public Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As PRINTER_INFO_2, _
ByRef Source As Byte, _
ByVal Length As Integer)

' ある位置から別の位置にメモリブロックを移動する関数の宣言
Public Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As DEVMODE, _
ByRef Source As Integer, _
ByVal Length As Integer)

' ある位置から別の位置にメモリブロックを移動する関数の宣言
Public Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As Integer, _
ByRef Source As DEVMODE, _
ByVal Length As Integer)

' プリンタの詳細な情報を設定する関数の宣言
Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As _
IntPtr, ByVal Level As Integer, ByRef pPrinter As PRINTER_INFO_2, ByVal Command_Renamed As Integer) As Boolean

' プリンタのオブジェクトハンドルを破棄する関数の宣言
Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As IntPtr) As Integer



Private Function SetPageSize(ByVal strPrinterName As String) As Integer


Dim strPrinterDeviceName As String
Dim udtPrinterDefaults As PRINTER_DEFAULTS
Dim lngPrinterHandle As IntPtr
Dim lngPrinterInfo2Level As Integer
Dim lngPrinterInfo2Needed As Long
Dim bytPrinterInfo2Buffer() As Byte
Dim udtPrinterInfo2 As PRINTER_INFO_2
Dim udtDevMode As DEVMODE
Dim lngWin32apiResultCode As Long
Dim BytesNeeded As Int32

' プリンタ名を指定
strPrinterDeviceName = strPrinterName

' プリンタアクセス権を指定
With udtPrinterDefaults
.DesiredAccess = PRINTER_ALL_ACCESS
End With
' プリンタのオブジェクトハンドルを取得
lngWin32apiResultCode = _
OpenPrinter(strPrinterDeviceName, _
lngPrinterHandle, _
udtPrinterDefaults)
' 構造体のレベルを指定
lngPrinterInfo2Level = 2
' バッファに必要なサイズを取得
lngWin32apiResultCode = _
GetPrinter(lngPrinterHandle, _
lngPrinterInfo2Level, _
0&, _
0, _
lngPrinterInfo2Needed)
' バッファを確保
ReDim _
bytPrinterInfo2Buffer _
(lngPrinterInfo2Needed - 2)
' 詳細なプリンタ情報を取得
lngWin32apiResultCode = _
GetPrinter(lngPrinterHandle, _
lngPrinterInfo2Level, _
bytPrinterInfo2Buffer(0), _
lngPrinterInfo2Needed, _
lngPrinterInfo2Needed)

' 取得した詳細なプリンタ情報を構造体へ移動
MoveMemory( _
udtPrinterInfo2, _
bytPrinterInfo2Buffer(0), _
Len(udtPrinterInfo2))

' 取得した詳細なプリンタデバイス情報を構造体へ移動
MoveMemory( _
udtDevMode, _
udtPrinterInfo2.pDevMode, _
Len(udtDevMode))

' 詳細なプリンタデバイス情報を設定
With udtDevMode
' 用紙が指定できるときは
If .dmFields And DM_PAPERSIZE Then
' 用紙を指定
.dmPaperSize = 46


' 構造体を取得した詳細なプリンタデバイス情報へ移動

MoveMemory( _
udtPrinterInfo2.pDevMode, _
udtDevMode, _
Len(udtDevMode))

'詳細なプリンタ情報を書き戻し
lngWin32apiResultCode = _
SetPrinter(lngPrinterHandle, _
lngPrinterInfo2Level, _
udtPrinterInfo2, _
0)
End If
End With
' プリンタオブジェクトをクローズ
lngWin32apiResultCode = _
ClosePrinter(lngPrinterHandle)


End Function

End Class
この投稿はマルチポストです。

●マルチポストされている場所
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200703/07030053.txt

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
お騒がせしてすみません。

> ●書き込みのマナーについて
> http://dobon.net/vb/bbs/index.html
マナーについて勉強し
今後は気をつけたいと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板