2010年06月29日


VB.net : printui.dll を LoadLibrary 経由で呼び出してデフォルトのプリンタを設定する

printui.dll は、Rundll32.dll で呼び出すものですが、他にもとてもたくさんの
機能を持っていますので、たいていのプリンタのパッチ処理はこれでてきてしまう
と思います。また、Rundll32.dll で呼び出される他の dll もインターフェイスが
同じなのでこの方法で呼び出す事ができるはずです

以下のダイアログは、rundll32.exe printui.dll,PrintUIEntry /? で表示されます

Printui

Rundll32 に関する Microsoftのドキュメント

[INFO] Windows の Rundll と Rundll32 インターフェイス
' ********************************************************
' ■ printui.dll 呼出し
' ********************************************************
Imports System.Runtime.InteropServices  ' DllImport 

Module MyModule
' ********************************************************
' * DLL 内 関数宣言
' ********************************************************
<DllImport("kernel32.dll", CharSet:=CharSet.Ansi)> _
Private Function LoadLibraryA( _
	<InAttribute(), MarshalAs(UnmanagedType.LPStr)> _
	ByVal lpDllName As String _
) As <MarshalAs(UnmanagedType.U4)> UInt32
End Function

<DllImport("kernel32.dll", CharSet:=CharSet.Ansi)> _
Private Function FreeLibrary( _
	<InAttribute(), MarshalAs(UnmanagedType.U4)> _
	ByVal hModule As UInt32 _
) As <MarshalAs(UnmanagedType.U4)> UInt32
End Function

<DllImport("kernel32.dll", CharSet:=CharSet.Ansi)> _
Private Function GetProcAddress( _
	<InAttribute(), MarshalAs(UnmanagedType.U4)> _
	ByVal hModule As UInt32, _
	<InAttribute(), MarshalAs(UnmanagedType.LPStr)> _
	ByVal lpProcName As String _
) As <MarshalAs(UnmanagedType.U4)> UInt32
End Function

' ********************************************************
' * 外部関数の型宣言
' ********************************************************
Delegate Sub PrintUIEntry( _
	<InAttribute(), MarshalAs(UnmanagedType.U4)> _
	ByVal hWndOwner As UInt32, _
	<InAttribute(), MarshalAs(UnmanagedType.U4)> _
	ByVal hInstance As UInt32, _
	<InAttribute(), MarshalAs(UnmanagedType.BStr)> _
	ByVal bstrParam As String, _
	<InAttribute(), MarshalAs(UnmanagedType.I4)> _
	ByVal nCmdShow As Int32 _
)

' ********************************************************
' 
' ********************************************************
Sub Main()

	Dim argv As String()

	' コマンドラインの取得
	argv = System.Environment.GetCommandLineArgs()
	if argv.Length <> 2 then
		Console.WriteLine("プリンタ名を指定して下さい")
		Exit Sub
	end if

	Dim TaragetDll As String = "printui.dll"
	Dim TaragetFunc As String = "PrintUIEntryW"

	Dim hModule As UInt32 = LoadLibraryA(TaragetDll)

	if hModule = 0 then
		Console.WriteLine(TaragetDll + " がみつかりませんでした")
		Exit Sub
	end if

	' ********************************************************
	' 実行
	' ********************************************************
	Dim ptr As IntPtr
	ptr = GetProcAddress(hModule, "PrintUIEntryW")
	if ptr <> IntPtr.Zero then


		Dim dllFunc As PrintUIEntry = _
			Marshal.GetDelegateForFunctionPointer( _
				ptr, _
				GetType(PrintUIEntry) _
			)
		
		Dim bstrParam As String = " /y /n """ + argv(1) + """"

		Call dllFunc( IntPtr.Zero, hModule, bstrParam, 5 )

	else
		Console.WriteLine( TaragetFunc + " が "+ TaragetDll +" の中にありません")
	end if

	Call FreeLibrary( hModule )


End Sub

End Module

関連する Microsoft ドキュメント

文字列に対する既定のマーシャリング
UnmanagedType 列挙体 (System.Runtime.InteropServices)
ShowWindow Function (Windows)


posted by at 2010-06-29 23:42 | VB.NET Framework2.0 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します