ActiveXDLLのExportされた関数名って取得できるんですか?
意味不明な質問かも知れませんが、ヒント等を教えていただければ幸いです;
予想としては、ActiveXDLLファイル中のリソースに"TYPELIB"リソースとして埋まっているのではないかと…未確認なので、本当にヒント程度だが…
返答ありがとうございます。見てみます〜。
VBのオブジェクトブラウザのような事をしたいのであれば、
TLBINF32.DLL を使ってみてください。
返答ありがとうございます。
使う というのは、参照設定でチェックマークを入れる ということですか?とりあえずTLBINF32.DLLをいじってみます。
いろいろやってみましたが、無理でした;;
とりあえず「できない」とういうことで解決にします。
とっても手抜きなサンプル。
Private Sub Command1_Click()
On Error Resume Next
List1.Clear
Dim FileName As String
FileName = "C:\Program Files\Common Files\System\ado\msado15.dll"
Dim TLApp As TLI.TLIApplication
Set TLApp = CreateObject("TLI.TLIApplication")
Dim TLInfo As TLI.TypeLibInfo
Set TLInfo = TLApp.TypeLibInfoFromFile(FileName)
Dim TypeInfo As TLI.TypeInfo
Dim Member As TLI.MemberInfo
For Each TypeInfo In TLInfo.TypeInfos
List1.AddItem "=== " & TypeInfo.Name & " (" & TypeInfo.TypeKindString & ") ==="
For Each Member In TypeInfo.Members
List1.AddItem Member.Name
Next
Next
Set TLInfo = Nothing
Set TLApp = Nothing
End Sub
サンプルありがとうございます。
でも、表示された関数名をGetProcAddressでの引数に指定しても使えませんでした;
GetProcAddress…ですか? それだと無理ですね。
ActiveXなDLLですから、COMの流儀に従った処理で書かないと。
単純なところだと、CallByName関数で呼べますよ。
例えば、ADODB.Connectionオブジェクトの Versionプロパティを
「"Version"という文字列」を使って呼び出すなら、
Set X = CreateObject("ADODB.Connection")
S = X.Version
と書く替わりに、
Set X = CreateObject("ADODB.Connection")
PropName = "Version"
S = CallByName(X, PropName, VbGet)
などと書けます。
えと、関数を実行したいのではなくて、関数のアドレスを取得したいんです。
【エクスポートされた関数名を取得】できれば、GetProcAdressでプロシージャのアドレスを取得できる→そのアドレスをSetWindowsHookExの第二引数に使用 というふうに考えているのですが・・・やはり無理ですか;;
ActiveXDLLに「外部関数」は
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
くらいしかないと思うぞ?
…公開されているのはクラスだしなぁ…
※駄レススマソ(orz
外部関数とCOMのクラスの両方が公開されている DLL もありますが(BASP21.DLLなど)、普通のActiveX DLLは、そうではありません。
# 公開されている関数の一覧は、Dependency Walker等で調査できます。
VB6製のActiveX DLLに関しては、(普通にコンパイルした場合は)
ガッさんが書かれた様に、DllRegisterServer などの 4関数が
公開される事になりますが、それらがクラスのメソッドと
結びついているという訳ではありませんし。
普通にコンパイルした場合は・・・ですか〜。
普通じゃない方法もあるんですか?
Undocumentedな手法なので詳細は書きませんが、LINK.EXE, C2.EXE のリンカオプションを
操作して、DLLの生成時にdefファイルを含めるという方式です。
# むかし、W.Stealride氏が Visual Basic Magazine誌に手順を書いていました。
C2.EXEやLINK.EXEのコマンドラインを編集するツール を使用した結果、defファイルを含めてコンパイルすることができました。
defファイルで指定した関数名をGetProcAdressの第二引数に指定したら、正しい戻り値が返ってきました。
結論:ActiveXDLLのエクスポートされた関数名は(defファイルを含めてコンパイルした場合)取得できる でした。
ガッさん 魔界の仮面弁士さん 助言ありがとうございました!
ツイート | ![]() |