VB6 - DLLの動的リンクの方法について

このQ&Aのポイント
  • VB6で統合アーカイバプロジェクトのDLLを遅延バインディングする方法はあるのでしょうか?
  • VB6では遅延バインディングを行うことができず、現在は全てのDLLの全ての関数に対してDeclare節を使用しています。
  • VB.netでは遅延バインディングを行うことができるが、VB6での方法は見つかりませんでした。
回答を見る
  • ベストアンサー

VB6 - DLLの動的リンクの方法について

統合アーカイバプロジェクトのdllを使用した解凍ツールを作ろうと思っているのですが、dllを遅延バインディングする方法はあるのでしょうか? 現在は全てのdllの、全ての関数に対してDeclare節を使用しているのですが、これでは統合アーカイバプロジェクトの仕様を全く役立てられていないということになります。 ○Library系のAPIで得られる関数へのポインタはVBで利用することは原則的に不可能 ○rundllは返り値を取れないため不適切 ○VB.netでは遅延バインディングを行うことができる という程度のことは調べることができましたが、VB6での遅延バインディングを実現する方法については見つけることができませんでした。 どなたかご存知の方よろしくご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>>exeの起動時にDLLが無いからといって~ >は検証済みです、ご指摘ありがとうございます。 >これをレイトバインディングというのですね。 普通は言いません。 レイトバインディング、アーリーバインディングはActiveXでの型の解決方法を指します。 >これを回して、1回目で >Declare Function UnlhaGetVersion% Lib "Unlha32" ()を、2回目で >Declare Function UnzipGetVersion% Lib "Unzip32" () >をそれぞれロードする、というようにDeclare節の定義を簡略化させたいのです。 言語使用としてDeclareステートメントを使用する限り絶対に不可能です。 #まぁ、9x系でしたらLoadLibraryとGetProcAddress、できないことも無いんですが、おすすめしません。 http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/#multimedia02 あとは、UNLHA32.DLLとかとVBの間に1つC++等で作った特殊なDLLをかますとかですね。 http://www.koalanet.ne.jp/~akiya/vbtaste/dll/

Futosi
質問者

お礼

回答ありがとうございます、とても勉強になりました。 「言語仕様として不可能」ということを聞けただけで、充分にこの質問を立てた意味があります。 また、参考URLまで調べていただき、感謝の限りです。 C++で橋渡しのDLLを作るのが解決策ですね、勉強を兼ねてそれを作ってみることにします。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>現在は全てのdllの、全ての関数に対してDeclare節を使用しているのですが、これでは統合アーカイバプロジェクトの仕様を全く役立てられていないということになります。 Declareステートメントは、該当のDLLの関数が初めて呼び出されるタイミングでDLLがロードされます。 よって、遅延ロードです。 exeの起動時にDLLが無いからといってエラーにはなりません。

Futosi
質問者

補足

回答ありがとうございます。 質問が悪かったようで申し訳ございません。 あと、遅延バインディングの使い方も間違っていたですか、申し訳ないです。 ご説明の >exeの起動時にDLLが無いからといって~ は検証済みです、ご指摘ありがとうございます。 これをレイトバインディングというのですね。 For I = 1 To 2 Me("Command" & I).Caption = "hogehoge" Next I のような感じで [archivername][funcname]をDeclare節で定義したいのです。 Join(strArcType,",") = "Unlha,Unzip" となる配列変数があり、 For I = 0 To UBound(strArcType) Declare Function strArcType(I) & "GetVersion%" _ Lib strArcType(I) & "32" () As Long Next I これを回して、1回目で Declare Function UnlhaGetVersion% Lib "Unlha32" ()を、2回目で Declare Function UnzipGetVersion% Lib "Unzip32" () をそれぞれロードする、というようにDeclare節の定義を簡略化させたいのです。 Susie Plug-Inのような感じでdllがあれば対応形式が増える、というものを目指しているのですが、こういった処理をすることはできるのでしょうか、という質問でした。 質問する側の不備、まことに申し訳ありません。

関連するQ&A

  • VB(6.0)で作成したDLLをVB(.Net)で呼び出す方法

    VB(6.0)で作成したDLLをVB(.Net)で呼び出すのに Public Declare Function 関数名 Lib "~.dllのパス"               (ByVal ・・・) As 型 このように呼び出してみているのですが 上手くいきません。整数データの変更も しました。 このDLLを呼び出せないと次に進めないので 本当に困っています。 よろしくお願いします。

  • VB.NET DLL【API関数(コールバック関数)】の呼び出し方法について

    目的は下記(3)のAPI関数をVB.NETで呼び出したいのですが、そこにいきつくまでにいろいろと壁にぶちあたっております。 (1)API関数をVB.NETから利用するにあたって どのような手順および調査・学習すればVB.NETからWin32 APIを独力で呼び出せるようになるのでしょうか?ネット上に情報が乏しく、いきずまっております。 (2)API関数の調査方法、またコールバック関数について 下記(a),(b)のようにWin32 API関数を宣言して、あとは呼び出し側の関数で(a),(b)で宣言したAPI関数を記述するだけで基本的には使用できるようになるという大まかなイメージはつかめております。 このあとでAPI関数をMSDNで調べると引数がHWNDやPCTSTRなど見慣れないものが出てきて、次のURL(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)を見ると、APIの型とVB.NETの型は違うので型変換をしなければならないとあります。またさらに私が呼び出したい関数はコールバック関数なるものでこれまた?な状態です。 そこでAPIとVB.NETの型変換の調査方法およびコールバック関数の利用方法などを教えていただけないでしょうか? (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) (3)InstallHinfSection関数(http://msdn2.microsoft.com/en-us/library/aa376957.aspx)について 下記のコードを実行したのですが、実行時エラーにはならないのですが、APIの関数が動作してくれません。どこが悪いのかがまったく見当がつかないのですがどなたかアドバイスいただけると助かります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click InstallHinfSection(Nothing, Nothing, "DefaultInstall 132 C:\INF_TEST\Original.inf", 0) End Sub   Declare Function InstallHinfSection Lib "setupapi" Alias "InstallHinfSection" (ByVal hwnd As String, ByVal ModuleHandle As String, ByVal CmdLineBuffer As String, ByVal nCmdShow As Integer) As Long APIが難しすぎていろいろとおかしなことを書いているかもしれませんが、どうぞよろしくお願いいたします。

  • API関数(DLL)の呼び出しにおいて、DLLの格納場所は?

    お世話になります。 VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。 (http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html) (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合においても、DLLの格納場所はC:\Windows\System32でないといけないのでしょうか?(実際にコーディングしてもSystem32フォルダにないとエラーになってしまいます。) 任意のフォルダにDLLを格納し、そこを参照できるようにできるのでしょうか? また、一般常識としてDLLはSystem32フォルダに格納しておかないといけないものなのでしょうか? 以上、よろしくお願いいたします。

  • VB6.0を使用しています

    VB6.0を使用しています VC6.0でdefファイルで宣言してDLLを作成し VBのEXEよりDLLをCALLしています。 VBではDLLの関数をDeclareで宣言しています。 問題なのは ちょっと前まで問題なく動いたDLLですが 新規にDLL関数を追加したら EXEではちゃんと呼び出して処理を行なってくれておりますが VBのデバッグ起動で呼び出すと、その新規のDLLの関数がありませんと メッセージを通知して止まってしまいます、 EXEでは動くのにデバッグ起動ではだめなんでしょうか??不思議です もし、ご存知の方がいらっしゃいましたら教えてください。

  • VB2005で作成したDLLの呼び出し方

    はじめまして、VB2005(.NET)初心者です。 現在、各プログラムを実行するためのメニュー プログラムを作成しています。 .net以前では、各プログラムをEXEで作成し API関数を利用し、メニューより実行させて いましたが、今回、各プログラムをEXEではなく dllで作成し実行する方法で作ることになりました。 各プログラムのdllを実行する方法がわかりません。 参考書等みてみましたが、見当たりません。 どのようにしていらっしゃるか教えて下さい。 宜しくお願いいたします。

  • VBからCで作成されたDLLへの引数の渡し方

    VBからCで作成されたAPI関数への引数の渡し方がわかりません。 C側の引数のデータ型はchar型でポインタ渡しではありません。 ------------------------------------------------ C側 int KANSU(char Mode) VB側 Public Declare Function KANSU Lib "USERAPI.dll" ( ByVal CHAR As Byte) As Long ------------------------------------------------ C側がポインタ渡しの場合は、VB側はSTRING型で別に悩むことはなかったのですが、文字列渡しの場合は、VB側はBYTE型で渡す必要があり、その方法がわかりません。 どなたか、分かる方よろしくお願いします。 ちなみに、VB6.0です。

  • VCで作成したDLLの使用

    VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000

  • VBAでDLLが見つからないエラー

    CADのVBA(6.0)ですが、DLLが見つからないエラーが出ます ' こっちはエラーが出ない Public Declare Function SearchVBApath Lib _ "C:\Program Files\AppliTool\VB\DDDD.dll" (ByVal env As String, ByVal s As String) As Integer 'こっちだとエラーが出る Public Declare Function SearchVBApath Lib "DDDD.dll" (ByVal env As String, ByVal s As String)    As Integer VBAプロジェクトファイルとDLLは同じフォルダにおいてあります 上記のようにフルパスだとエラーが出ないのですがDLL名だけだとこの関数のところでエラーがでます このDLL関数宣言行の前の方には他のDLL関数も同じようにパス省略で記述しているのですがそちらにはエラーが出ません どなたかヒント下さい、よろしくお願いします。

  • VB 2008 DLL作成の方法

    当方Visual Studio 2008のVB、C++で開発をしています。 VS2008のVBでクラスライブラリとして作成し、ビルドをしてDLLを作成したのですが、 対となるLIBファイルがどこにも見当たりませんでした。 VS6.0のVBではLIBファイルも作成されました。 VS2008のVBでLIBファイルを作成する方法をご存知の方いらっしゃいましたら教えてください。 LIBファイルを使用する理由は、VBで作成したDLLをC++に組み込むときにリンクさせる為です。 ※今回はLoadLibrary関数を使わず、LIBファイルを使おうと考えています 以上、宜しくお願い致します。

  • dllを使用しVB側に文字列を返す2

    No.280310の質問の続きになってしまいますが 「VCで作ったdllを使用し VBに文字列を返すことはできますか」 でVCで作ったdllをVBを呼び出す事ができるようになりました。 Declare宣言で疑問に思ったのですが Declare Function TxtCnt Lib "hoge.dll" (ByVal a As String) As Long aはなぜ値渡しなのでしょうか? 変数が書き換えられて戻ってくるので、byrefで指定していました。 それが問題が起こしていた原因一つでした。 ちなみにint型の数値をポインタで渡した場合はbyrefでうまくいきます。 ご教授願います。

専門家に質問してみよう