supermabさんのブログの記事「Excel から使うマネージDLL を作る。」、ここまで丁寧に解説されたサイトは少ないので非常に参考になります。
ただ、記事中にも書かれていますがDLLの登録・登録解除がどうしても手間になってしまいます。
XPであれば特に大きな問題は無いのですが、Vista以降UACが絡んでくる都合上、一工夫する必要がありそうです。
では具体的にどうするか?パッと思いつくのは「runas」付きでShellExecuteメソッドを実行する方法。
早速試してみました。
'********************************************************* ' ドラッグされたマネージドDLLをRegAsmで登録するスクリプト ' ' 2011/04/05 kinuasa '********************************************************* Option Explicit Dim Args Dim FSO Dim f Dim DllFilePath Dim WindowsFolderPath Dim FrameworkFolderPath Dim SubFrameworkFolderPath Dim RegAsmFilePath Dim ArgStr Const Opt = " /tlb /codebase" 'RegAsmに渡すオプション Const MsgTitle = "RegAsm実行" RegAsmFilePath = "" '初期化 Set Args = WScript.Arguments If Args.Count < 1 Then MsgBox "DLLを当スクリプトファイルにドラッグ&ドロップして処理を実行してください。", 16, MsgTitle WScript.Quit End If Set FSO = CreateObject("Scripting.FileSystemObject") Select Case LCase(FSO.GetExtensionName(Args(0))) Case "dll" DllFilePath = Args(0) Case Else MsgBox "DLLを当スクリプトファイルにドラッグ&ドロップして処理を実行してください。", 16, MsgTitle WScript.Quit End Select Set Args = Nothing '.NET Frameworkフォルダのパス取得 WindowsFolderPath = FSO.GetSpecialFolder(0).Path If Right(WindowsFolderPath, 1) <> "\" Then WindowsFolderPath = WindowsFolderPath & "\" FrameworkFolderPath = WindowsFolderPath & "Microsoft.NET\Framework\" If FSO.FolderExists(FrameworkFolderPath) <> True Then MsgBox ".NET Frameworkフォルダが見つかりませんでした。" & vbCrLf & _ "処理を中止します。", 16, MsgTitle WScript.Quit End If 'RegAsm.exeのパス取得 With CreateObject("ADODB.Recordset") .Fields.Append "Path", 200, 255 .Open For Each f In FSO.GetFolder(FrameworkFolderPath).SubFolders .AddNew .Fields("Path").Value = f.Path .Update Next .Sort = "Path DESC" 'Framework各バージョンフォルダ名を降順ソート .MoveFirst Do Until .EOF SubFrameworkFolderPath = .Fields(0) If Right(SubFrameworkFolderPath, 1) <> "\" Then SubFrameworkFolderPath = SubFrameworkFolderPath & "\" If FSO.FileExists(SubFrameworkFolderPath & "RegAsm.exe") Then If MsgBox("[" & SubFrameworkFolderPath & "RegAsm.exe]で登録しますか?", vbYesNo, MsgTitle) = vbYes Then RegAsmFilePath = SubFrameworkFolderPath & "RegAsm.exe" Exit Do End If End If .MoveNext Loop .Close End With Set FSO = Nothing If Len(RegAsmFilePath) < 1 Then MsgBox "[RegAsm.exe]が見つかりませんでした。" & vbCrLf & _ "処理を中止します。", 16, MsgTitle WScript.Quit End If ArgStr = """" & DllFilePath & """" & Opt CreateObject("Shell.Application").ShellExecute RegAsmFilePath, ArgStr, "", "runas" 'runas付きで実行
'************************************************************* ' ドラッグされたマネージドDLLをRegAsmで登録解除するスクリプト ' ' 2011/04/05 kinuasa '************************************************************* Option Explicit Dim Args Dim FSO Dim f Dim DllFilePath Dim WindowsFolderPath Dim FrameworkFolderPath Dim SubFrameworkFolderPath Dim RegAsmFilePath Dim ArgStr Const Opt = " /tlb /u" 'RegAsmに渡すオプション Const MsgTitle = "RegAsm実行" RegAsmFilePath = "" '初期化 Set Args = WScript.Arguments If Args.Count < 1 Then MsgBox "DLLを当スクリプトファイルにドラッグ&ドロップして処理を実行してください。", 16, MsgTitle WScript.Quit End If Set FSO = CreateObject("Scripting.FileSystemObject") Select Case LCase(FSO.GetExtensionName(Args(0))) Case "dll" DllFilePath = Args(0) Case Else MsgBox "DLLを当スクリプトファイルにドラッグ&ドロップして処理を実行してください。", 16, MsgTitle WScript.Quit End Select Set Args = Nothing '.NET Frameworkフォルダのパス取得 WindowsFolderPath = FSO.GetSpecialFolder(0).Path If Right(WindowsFolderPath, 1) <> "\" Then WindowsFolderPath = WindowsFolderPath & "\" FrameworkFolderPath = WindowsFolderPath & "Microsoft.NET\Framework\" If FSO.FolderExists(FrameworkFolderPath) <> True Then MsgBox ".NET Frameworkフォルダが見つかりませんでした。" & vbCrLf & _ "処理を中止します。", 16, MsgTitle WScript.Quit End If 'RegAsm.exeのパス取得 With CreateObject("ADODB.Recordset") .Fields.Append "Path", 200, 255 .Open For Each f In FSO.GetFolder(FrameworkFolderPath).SubFolders .AddNew .Fields("Path").Value = f.Path .Update Next .Sort = "Path DESC" 'Framework各バージョンフォルダ名を降順ソート .MoveFirst Do Until .EOF SubFrameworkFolderPath = .Fields(0) If Right(SubFrameworkFolderPath, 1) <> "\" Then SubFrameworkFolderPath = SubFrameworkFolderPath & "\" If FSO.FileExists(SubFrameworkFolderPath & "RegAsm.exe") Then If MsgBox("[" & SubFrameworkFolderPath & "RegAsm.exe]で登録解除しますか?", vbYesNo, MsgTitle) = vbYes Then RegAsmFilePath = SubFrameworkFolderPath & "RegAsm.exe" Exit Do End If End If .MoveNext Loop .Close End With Set FSO = Nothing If Len(RegAsmFilePath) < 1 Then MsgBox "[RegAsm.exe]が見つかりませんでした。" & vbCrLf & _ "処理を中止します。", 16, MsgTitle WScript.Quit End If ArgStr = """" & DllFilePath & """" & Opt CreateObject("Shell.Application").ShellExecute RegAsmFilePath, ArgStr, "", "runas" 'runas付きで実行
上記スクリプトにDLLファイルをドラッグ&ドロップ。
tlbファイルを出力されて、VBAからでも使うことが出来ました。
なかなか上手くいっていそうです。
上記スクリプトをZip形式で圧縮したのがコチラ。
2011/04/08 9:02 am |
おはようございます♪
さすが師匠!
このスクリプトでDLL の配布が楽になります♪
ドラッグ&ドロップ っていうのも、素敵です^^
それにしてもDLLの配布って、面倒くさいですね(泣)
Windowsインストーラが、安定して動いてくれて、
かつ、もう少しわかりやすいと良いんですけどね・・・
2011/04/09 10:56 am |
> supermabさん
こんにちは。
> ドラッグ&ドロップ っていうのも、素敵です^^
別で書いたヤツの使い回しです(笑)
.NET Frameworkのバージョン判別で悩みましたが、結局フォルダの有無とユーザー選択にしました。
> Windowsインストーラが、安定して動いてくれて、
> かつ、もう少しわかりやすいと良いんですけどね・・・
ホントそうですね!
本来であればインストーラで上手くいくはずなんですが、その辺りのノウハウがよく分からんです・・・(^^;
2011/04/21 8:47 am |
kinuasa様
はじめまして、大久保と言います。
私は趣味で作ったソフトやマクロを配布したり販売したりしています。
久しぶりにエクセルマクロとDLLを作成したのですが、
Vistaや7のUAC対応で悩んでいました。
そして、このページにたどり着き、素晴らしいスクリプトに出会いました。
このスクリプトを利用させて頂きたいのですが、
商用DLLの登録に利用させていただくことは可能でしょうか?
以上、よろしくお願いします。
大久保
2011/04/21 10:55 am |
はじめまして、大久保様。
当スクリプトの商用利用についてですが、特に禁止事項は設けておりませんので、商用・非商用問わずご自由にご利用ください。
コードの改変も自由に行っていただいて構いません。
ただ当スクリプトで何か問題が起こった場合(恐らく問題無いと思いますが)、私の方では責任を負いかねますので、その点だけはご了承ください。
2011/04/22 1:12 pm |
kinuasas様
ありがとうございます。
利用させていただきます。
以上、よろしくお願いします。
大久保