- PR -

DLLの種類と定義について

投稿者投稿内容
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-10 14:51
よろしくお願いいたします。
最近javaからVB.NET2005に転向した若輩者です。

VB.NET2005から、VC++で作成されたDLLをコールしたく、参照設定にて該当DLLを追加したところ、
「xxx.dllへの参照を追加できませんでした。(中略)
有効なアセンブリまたは、COMコンポーネントであることを確認してください。」
とのエラーメッセージが出ました。
上記DLLの正体や、コール方法を調べている過程で、そもそもDLLの多様さに困惑しており、
本来目的に行き着かない状況です。

■DLLの種類・定義について、ご教示頂けないでしょうか?

[理解出来た範囲]
・VB.NETで作成したDLL
 →CLR上で動作するMSIL形式ファイル。
  他のVB.NETプロジェクトから参照設定して呼び出し可能。

[理解出来ていない範囲]
・COMコンポーネント
・ActiveX DLL(COMコンポーネントの別名?)
・Win32DLL
・標準C,C++で記述されたDLL(正式名称が分からないのですが・・)
・その他DLL


有識者の方々、よろしくお願い致します。

やんち
常連さん
会議室デビュー日: 2008/10/24
投稿数: 32
投稿日時: 2008-11-10 15:14
・COM(Component Object Model)は、DLLを他言語からも、呼び出せるようにする為の、
DLLの書き方を取り決めた規格です。

・ActveX DLLは、COMをさらに発展させた規格。
COMにいくつかの自動化処理などが、追加されています。

・Win32DLLは、何を説明しよう。DLLの形式です。WindowsでDLLを作成する時に選択します。

・標準C,C++で記述されたDLL(正式名称が分からないのですが・・)
何だろう?

・DLL(Dynamic Link Library)
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-11-10 16:02
#用語の使い方やそれぞれの説明の細かい部分についてはあまり自信がないので、
#このコメントは鵜呑みにはしないでください。

VB.NETから呼び出せる外部のライブラリには、おおまかに以下の3つがあります。

(1) .NETで作成したEXEやDLL
 .NETで開発したアセンブリ(EXE、DLL)は、参照設定することで、
他のクラス同様に呼び出せます。

(2) COM
 ActiveX DLL、ActiveX EXE、ActiveX コントロールがあります。
 COMのモジュールは参照設定するとCOMのラッパーが自動生成され、
.NETのクラスと同じように使うことが出来ます。ただし、.NETのクラスのように
扱えるだけで、あくまでCOMのオブジェクトなので、その解放処理には
気を使う必要があります。

(3) Windows APIに代表されるいわゆる普通のDLL
VBではDeclareステートメントを使う方法とDLLImport属性を使って呼び出す方法があります。
C/C++でCOMでも.NETでもでないDLLを作成した場合は、通常、このDLLになります。
ただし、このタイプのDLLの中でも、関数の呼び出し規約というのがあり、
Windows APIではstdcallですが、誰かが作成したDLLではそれ以外の規約になっているかもしれません。
呼び出し規約の指定はDLLImport属性で細かく指定できます。


> [理解出来た範囲]
> ・VB.NETで作成したDLL
>  →CLR上で動作するMSIL形式ファイル。
>   他のVB.NETプロジェクトから参照設定して呼び出し可能。

これは(1)ですね。

> [理解出来ていない範囲]
> ・COMコンポーネント
> ・ActiveX DLL(COMコンポーネントの別名?)

(2)ですね。

> ・Win32DLL

広い意味だと(2)も(3)も意味しているかもしれません。
狭い意味だと(3)を指しているのでしょうかね。
この辺の用語は曖昧に使われていることが多いので、
正確な定義については不明です。

> ・標準C,C++で記述されたDLL(正式名称が分からないのですが・・)

(3)の意味で使われている可能性が高いですが、
その言葉通りの意味で捉えるなら、どのように作ったのかによって
(1)〜(3)のどれの場合もありえます。

> ・その他DLL
わかりません。


[ メッセージ編集済み 編集者: よねKEN 編集日時 2008-11-10 16:03 ]
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-10 16:02
やんち様、ありがとうございます。

やんち様のご説明から、COM以外のDLLは、VB2005からコールするときに
特別な手続きが必要なのかな、と受け取りました。
私の扱おうとしているDLLは、冒頭のエラーメッセージから、
COM以外の何れかかと思うのですが、DLLファイルから、
その種類を判別する事は可能なのでしょうか?

--------------------- 引用 ---------------------
>・標準C,C++で記述されたDLL(正式名称が分からないのですが・・)
>何だろう?
------------------------------------------------
→Windows固有のライブラリ(MFC?)に依存して作成されたDLLを「Win32DLL」と
 思っており、それ以外の純粋なCのみで記述されたDLLと区別していたのですが、
 VB.NETからコールする際には、いずれも変わらないのでしょうか?

よろしくお願いいたします。
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-10 16:23
よねKEN様、ありがとうございます。

理解不足から曖昧な用語で質問してしまい、申し訳ありあませんでした。
かなりスッキリ致しました。

私の扱おうとしているDLLは、『(3) Windows APIに代表されるいわゆる普通のDLL』
に該当するものと思われます。「関数の呼び出し規約」が何かを確認し、
それにあったコール方法を調べて行こうと思います。
(データ型変換など先は長そうですが・・)


DLLの種類や作られ方について、ご指摘の「関数の呼び出し規約」のような、
最低限事前に確認しておくべき特性は、他にもあるのでしょうか?

よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-11-10 16:29
引用:

TAKAさんの書き込み (2008-11-10 16:23) より:
DLLの種類や作られ方について、ご指摘の「関数の呼び出し規約」のような、
最低限事前に確認しておくべき特性は、他にもあるのでしょうか?



・関数の引数/戻り値で文字列を扱う場合はその文字コード
・構造体が使われている場合はアラインメント
辺りを気にしておけばよいでしょうか。
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-10 16:44
よねKEN様、ありがとうございます。
おかげさまで、ゴールまでの距離感が少し見えてきました。

↓当初の質問とはズレてしまうのですが、お時間あれば、教えて下さい。

>広い意味だと(2)も(3)も意味しているかもしれません。
>狭い意味だと(3)を指しているのでしょうかね。
>この辺の用語は曖昧に使われていることが多いので、
>正確な定義については不明です。

→DLLの種類によって扱い方が違うのに、これって、困らないのでしょうか?
 実際に私は、扱おうとしているDLLをどう説明すればよいのか非常に困惑しました。
 .NET開発者の間で、スタンダード的な認識や呼び方などは、あるのでしょうか?
 (Win32DLLと呼んで一般に通じるものでしょうか?)

やんち
常連さん
会議室デビュー日: 2008/10/24
投稿数: 32
投稿日時: 2008-11-10 17:01
COM形式以外のDLLの呼び出しだと、
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
このあたりが、参考になるかも知れません。

スキルアップ/キャリアアップ(JOB@IT)