メソッドを公開するだけならば、わりと簡単です。イベントも欲しい場合、というか
当然欲しいので、多少面倒ですがインターフェイス定義をしてやると何でもありにな
ります。
' GUID は、guidgen.exe で取得しました
' 以下のどれでも同じです
' C:\Program Files\Microsoft Visual Studio 8\Common7\Tools
' C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin
' C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools
' C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
' ※ VB.net のイベントを COM へ公開する為のインターフェイス定義
<Guid("5FB047A1-0662-4fe6-B79E-552D08FCC7BA"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface ILboxToolEvents
<DispId(1)> _
Sub EndDownload()
<DispId(2)> _
Sub EndDownload2( str As String )
End Interface
イベントの数だけ、DispId とイベントの型の定義をする必要があります。
VB.net の中では、ユーザーイベントを作成して呼び出すだけです。ポイ
ントは、クラス定義の属性として、ComSourceInterfaces を定義するだけ
です。
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices ' DllImport
' Framework2.0 用の記述
'<Assembly: AssemblyKeyFile("lightbox.snk")>
' Framework3.5 では、vbc.exe のコマンドラインに /keyfile:lightbox.snk を追加します
Namespace lboxTool
' GUID は、guidgen.exe で取得しました
' 以下のどれでも同じです
' C:\Program Files\Microsoft Visual Studio 8\Common7\Tools
' C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin
' C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools
' C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
' ※ VB.net のイベントを COM へ公開する為のインターフェイス定義
<Guid("5FB047A1-0662-4fe6-B79E-552D08FCC7BA"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface ILboxToolEvents
<DispId(1)> _
Sub EndDownload()
<DispId(2)> _
Sub EndDownload2( str As String )
End Interface
' VB.net のイベントを COM へ公開する
<ComSourceInterfaces(GetType(ILboxToolEvents))> _
Public Class lbox
' Win32 API を使う為の定義
<DllImport("urlmon.dll", CharSet:=CharSet.Unicode)> _
Private Shared Function URLDownloadToFile( _
ByVal pCaller As Integer, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Integer, _
ByVal lpfnCB As Integer _
) As Integer
End Function
' ******************************************************
' COM へ公開するメソッド
' ******************************************************
Public Function URLDownloadToFile( target As String, _
Optional local As String = Nothing ) As Boolean
Dim ret As Integer
Dim data As String()
Dim result As Boolean = True
if local is Nothing then
data = target.Split("/")
local = data(data.Length-1)
end if
ret = URLDownloadToFile( 0, target, local, 0, 0 )
if ret = 0 then
' ***********************
' イベントを発生させる
' ***********************
RaiseEvent EndDownload()
RaiseEvent EndDownload2( target )
else
result = False
end if
End Function
' ******************************************************
' COM へ公開するイベント
' ******************************************************
Public Event EndDownload()
Public Event EndDownload2( URL As String )
End Class
End Namespace
サンプルとしては、本来はスレッド使って非同期なイベントを作りたい
ところですが、複雑になるので同期のファイルダウンロードの終了イベ
ントを二通り作成しています。これを後で、WSH の VBScript と HTA で
利用するわけです。
ビルドの前に lightbox.snk
sn.exe -k lightbox.snk
sn.exe は、C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin にある
ので、これは Visual Studio 等がインストールされていないと作成できない
と思いますが、内容が内容なので、たぶんこの辺は OK でしょう。
ビルド
Framework2.0 と Framework3.5 で違いがありました。詳細はソースコードに
書いてありますが、以下のコマンドラインは 3.5 用です。
vbc.exe /target:library /keyfile:lightbox.snk lboxCom.vb
これで dll が作成されるので、問題が無ければシステムに登録します。
システムに登録
regasm lboxCom.dll /tlb:lboxComLib.tlb /codebase
カレントに dll を置いて実行すると、この場所でレジストリに登録され
ます。タイプライブラリ(lboxComLib.tlb)は、この時作成されます。
もし元の dll の内容を変更した場合は、一旦登録を削除して下さい。
regasm lboxCom.dll /unregister
問題なければ、以上で、lboxTool.lbox が登録された事になります。
次の記事(WSH&HTAで使用)
VB.net のイベントを COM へ公開する(2)。
つまり、WSH や HTA で VB.net で書いたコードを実行すると言う事。
posted by lightbox at 02:07
|
Comment(0)
|
サンプル
|

|