- 締切済み
DLLについて
VC++でDLLを作成しようとしているのですがいくつか判らない点があります。 1. スタティックライブラリとスタティックリンクライブラリの違い。この二つの用語の違いが分かりません。 2.VBからVC++で作成したDLLを使用するときには.libファイルは必要ないのでしょうか。使用しなくても、使うことができたので。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- MrBan
- ベストアンサー率53% (331/615)
VBという存在自体に興味がないのですが、そもそもこいつに.libなんて無縁では。 WindowsのDLLのインターフェイスはバイナリベースであり、インポートの仕方は呼出側に依存します。 基本的に、汎言語的に必須なのはあくまでDLL本体だけです。 .libというか、インポートライブラリの位置づけを誤解されていませんか。 インポートライブラリ自体は、DLLのインターフェイスではありません。中間ファイル(.obj)を作るような言語からDLLを参照しやすくするためのプロキシです。インポートライブラリが意味を持つのはスタティックリンクする言語であって、それ以外では原則として無意味です。 そもそも中間ファイルとリンクするためのものですから、VC++用のインポートライブラリとBCC用のインポートライブラリは違う形式ですし、DLLからツールで専用のインポートライブラリを生成したりすることもあります。 言語次第では独自の方法でDLLをインポートできます。 # VBなら「宣言」 1-a 用法上、そう考えても問題ないでしょう。 1-b Yes. 2-a,b VBでインポートライブラリって意味があるのですか? > 2.VBからVC++で作成したDLLを使用するときには.libファイルは必要ないのでしょうか。 Yes。 言語を問わず、 インポートライブラリであるかを問わず、 WindowsのDLLを使用するために.libは必須ではない。
- MrBan
- ベストアンサー率53% (331/615)
> DLL自体はDLLの検索されるところに配置すればよいのですが、 > .libファイルはプロジェクトに参加させる必要がないということですね。 その通りです。 > VCからDLLを呼ぶ際に.libファイルを使わずに済むには > 何かすることがありますか。 関数の取得コードを自分で書く必要があります。 LoadLibrary API で DLL を指定してロードし、 GetProcAddress API で、内部の関数ポインタを取得します。 後は関数ポインタから関数呼び出しします。 取得した関数ポインタをキャストするには、VBの宣言相当の情報が必要です。 また、実際に使うには、インターフェイス仕様(何を渡すとどう動くか)を知っている必要があるのも一緒です。 インポートライブラリを使った場合や、VBはこれらをやってくれる、と。
補足
>インポートライブラリを使った場合や、VBは >これらをやってくれる、と。 ここがひっかかります。何度もすいません。 ※実行形式というのはDLL内の関数を呼び出すものを指しています。 (1)VCアプリからVCで作ったDLLを呼び出す (a)インポートライブラリを使う場合 実行形式内にある関数と同様にDLL内の 関数を使用する。 (b)インポートライブラリを使わない場合 LoadLibrary API、GetProcAddress APIを使って コードを書く。 //(1)の(a)(b)については自信がありません。 (2)VBアプリからVCで作ったDLLを呼び出す (a)インポートライブラリを使う場合 実行形式内にある関数と同様にDLL内の 関数を使用する。 (b)インポートライブラリを使わない場合 ”この場所” ”この場所”は(1)の(b)同様のものがくるはずだと思っていました。ところが実際には(2)の(a)と同じように、実行形式内にある関数のようにインポートしたDLL内の関数を書いたら、動いてしまいました。 VBのソースの上の方に 「 Declare Function fncSub Lib "TEST.dll" (ByVal a As Long, ByVal b As Long) As Long 」 のようなものを書くことでインポートライブラリをプロジェクトに追加するのと同じ効果が得られているのでしょうか。
- MrBan
- ベストアンサー率53% (331/615)
1. スタティックライブラリといえば、スタティックリンクライブラリをさすのが普通です。つまり、表現の違いだけで同一のもの。 2.一般に.libという拡張子がある場合、スタティックライブラリを指しますが、その中にDLLの呼び出しを簡単にするためのインポートライブラリと呼ばれる類があります。インポートライブラリとはスタティックにリンクしますが、処理の実体はDLLにあるので、いわゆる一般のスタティックライブラリとは意味あいが微妙に違います。(Proxyですね ダイナミックリンクライブラリ(DLL)を使う場合、インポートライブラリがある方が楽なので、通常はインポートライブラリ(.lib)を使います。但し、DLLのインターフェイスなどが分かっているなら、VB/VCを問わず.lib は必須ではありません。 という説明でよろしいですか。
補足
ご回答ありがとうございます。 1については、納得しました。 2はインポートライブラリ、スタティックライブラリの仕様用途は理解できるのですが、 >但し、DLLのインターフェイスなどが分かっている >なら、VB/VCを問わず.lib は必須ではありません。 というところがひっかかります。 DLL自体はDLLの検索されるところに配置すればよいのですが、.libファイルはプロジェクトに参加させる必要がないということですね。 VBの場合はソースファイルの上のほうに、 「 Declare Function fncSub Lib "TEST.dll" (ByVal a As Long, ByVal b As Long) As Long 」 のようなものを書けばよいとして、VCからDLLを呼ぶ際に.libファイルを使わずに済むには何かすることがありますか。
お礼
ご回答ありがとうございます。 まだ勉強不足で回答に書かれていることが理解できません。これから勉強して行こうと思います。 繰り返し質問に答えて頂きまして感謝しております。