ActiveX DLLについて

解決


zero  2004-12-01 08:16:37  No: 87007

ActiveXDLLのExportされた関数名って取得できるんですか?
意味不明な質問かも知れませんが、ヒント等を教えていただければ幸いです;


ガッ  2004-12-01 16:41:14  No: 87008

予想としては、ActiveXDLLファイル中のリソースに"TYPELIB"リソースとして埋まっているのではないかと…未確認なので、本当にヒント程度だが…


zero  2004-12-03 06:29:17  No: 87009

返答ありがとうございます。見てみます〜。


魔界の仮面弁士  2004-12-03 21:21:31  No: 87010

VBのオブジェクトブラウザのような事をしたいのであれば、
TLBINF32.DLL を使ってみてください。


zero  2004-12-04 06:53:38  No: 87011

返答ありがとうございます。
使う  というのは、参照設定でチェックマークを入れる  ということですか?とりあえずTLBINF32.DLLをいじってみます。


zero  2004-12-06 06:29:21  No: 87012

いろいろやってみましたが、無理でした;;
とりあえず「できない」とういうことで解決にします。


魔界の仮面弁士  2004-12-06 20:54:37  No: 87013

とっても手抜きなサンプル。

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


zero  2004-12-14 05:33:19  No: 87014

サンプルありがとうございます。
でも、表示された関数名をGetProcAddressでの引数に指定しても使えませんでした;


魔界の仮面弁士  2004-12-14 06:03:49  No: 87015

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)
などと書けます。


zero  2004-12-16 03:47:18  No: 87016

えと、関数を実行したいのではなくて、関数のアドレスを取得したいんです。

【エクスポートされた関数名を取得】できれば、GetProcAdressでプロシージャのアドレスを取得できる→そのアドレスをSetWindowsHookExの第二引数に使用  というふうに考えているのですが・・・やはり無理ですか;;


ガッ  2004-12-16 04:32:16  No: 87017

ActiveXDLLに「外部関数」は
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
くらいしかないと思うぞ?
…公開されているのはクラスだしなぁ…
※駄レススマソ(orz


魔界の仮面弁士  2004-12-16 05:54:52  No: 87018

外部関数とCOMのクラスの両方が公開されている DLL もありますが(BASP21.DLLなど)、普通のActiveX DLLは、そうではありません。

# 公開されている関数の一覧は、Dependency Walker等で調査できます。

VB6製のActiveX DLLに関しては、(普通にコンパイルした場合は)
ガッさんが書かれた様に、DllRegisterServer などの 4関数が
公開される事になりますが、それらがクラスのメソッドと
結びついているという訳ではありませんし。


zero  2004-12-16 08:16:56  No: 87019

普通にコンパイルした場合は・・・ですか〜。
普通じゃない方法もあるんですか?


魔界の仮面弁士  2004-12-16 09:59:06  No: 87020

Undocumentedな手法なので詳細は書きませんが、LINK.EXE, C2.EXE のリンカオプションを
操作して、DLLの生成時にdefファイルを含めるという方式です。

# むかし、W.Stealride氏が Visual Basic Magazine誌に手順を書いていました。


zero  2004-12-17 00:33:44  No: 87021

C2.EXEやLINK.EXEのコマンドラインを編集するツール を使用した結果、defファイルを含めてコンパイルすることができました。
defファイルで指定した関数名をGetProcAdressの第二引数に指定したら、正しい戻り値が返ってきました。

結論:ActiveXDLLのエクスポートされた関数名は(defファイルを含めてコンパイルした場合)取得できる  でした。

ガッさん  魔界の仮面弁士さん  助言ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加