DLLとコンポーネント技術

《 初回公開:2020/05/14 , 最終更新:未 》

DLLはダイナミックリンクライブラリ (Dynamic Link Library)の略。
Windowsのコンポーネント(プログラム部品)はDLLとして実装されていると言っていいかな。

【 目次 】

ライブラリ

そもそもライブラリとは

いろいろなプログラムで共通に使用できる関数等(デ-タの場合も)をメインプログラムから分離して共通に利用できるようにしたものを指すのかな。

スタティックリンクとダイナミックリンク

ライブラリにはスタティックリンクとダイナミックリンクというのがあって、
スタティックリンクのコードは実行ファイル内に組み込まれるのに対して、ダイナミックリンクでは実行ファイルから実行時に動的に別ファイルのDLLのコードがロードされる仕組みになっている。

Linuxの場合は

スタティックライブラリについては参考記事のみを以下に示しておく。

拡張子.LIB

インポートライブラリ スタティックライブラリ オブジェクトライブラリ

VC++からライブラリをリンクする場合、二つの形式のライブラリ、スタティックライブラリとインポートライブラリがあって、どちらも拡張子が.LIBとなっていて混同しやすい

スタティックライブラリはオブジェクトライブラリとも呼ばれオブジェクトコードが含まれていて、前項でも述べた通りリンク時に静的に実行ファイルに結合される。
インポートライブラリにはオブジェクトコードが含まれておらず、リンク時に実行時に呼び出される外部のDLLの参照先を示すために使われる。

DLL

DLLとは

ライブラリプログラムをDLLとして実装する事で、コードとリソースを共有したりプログラムの実行サイズを小さくしたり、ライブラリプログラムをその時の実行状況に応じて臨機応変に呼び出したりできるって事かな。
それでもって、ライブラリプログラムに変更が生じたとしても、スタティックリンクと違いライブラリのインターフェース(関数プロトタイプ宣言)に変更がなければライブラリプログラムの修正のみで呼び出し側プログラムに変更を加える必要は無い。

DLLは多くの異なるプログラムから利用される関数やリソース,オブジェクト等を提供する。
他のプログラム(DLL呼び出しをサポートしたwindosのプログラミング言語の)から呼び出せる共通ライブラリ。
DLLを作る言語とDLLを利用する言語は別の言語で構わない。
例えば、VC++やDelphi,C#で実装されたDLLをExcelマクロ等のVBAから呼び出したりと。
windows版のRubyやPythonからもDLLを呼び出す事ができる。
DLLを利用する事で異なる言語間の連携、(いわゆる昔MSDOSの時代に話題となった)ミックスドランゲージプログラミングを実現することができる。

DLLはDLLを呼び出すアプリケーション(クライアントプログラム)のメモリー空間にロードされDLLが確保するメモリやリソースはアプリケーションが所有することになる。
つまり呼び出し側プロセスのアドレス空間にDLLのファイルイメージがマッピングされる。
マッピングされたDLLはプロセス内のすべてのスレッドから利用可能。
DLL関数のコードによって作成されたオブジェクトは呼び出し側スレッドまたはプロセスによって所有される。

DLLの種類

DLLにはいろいろなものがあってまたややこしい。

ネイティブDLL

ネイティブDLLはアンマネージ(或いはアンマネージド)DLLとも呼ばれる。
.NET FrameworkによるCLR上で動作するDLLをCLRに管理されたDLLという意味でマネージDLLと呼ぶのに対して、従来からある本来のDLLという意味でネイティブDLL,或いはマネージされていないDLLという意味でアンマネージDLLという呼び方をされる。

"Windows API"はネイティブDLLとして実装されている。
それでネイティブDLLはwin32(とか64ビット版の場合はwin64)DLLとか呼ばれたりもする。

ネイティブDLLを実装できる処理系としてはVC++やDelphi,C++Builderがある。

マネージドDLL

.NET FrameworkによるCLR上で動作するV#やVB.NET等のクラスライブラリとして実装されたDLL。
VC++でもC++/CLIを使って実装する事ができるようだ。

ActiveX DLL(COM)

ActiveX COM

COMはComponent Object Modelの略
マイクロソフトソフトはその時々でいろいろ呼び方を変更するのと似たような名称の乱用により正確な名称というのはあいまいであるが、
.NET Framework以前のマイクロソフトソフトのコンポーネント(プログラム部品)技術でActiveXと呼ばれたりもする。

COMにはコンポーネントであるCOMサーバそしてCOMサーバを利用する側をCOMクライアントと呼ぶ。

COMにはいろいろな種類があって

COMオブジェクト

COMサーバはVC++でも実装できるが

VC++やVB(VB.NETでは無く.NET以前のVisualBASIC)やDelphiで実装可能。
でもVBはサポート終了。

ocx

VB等のFormに配置するプログラム部品のocxもCOMに含まれる。

拡張子は.ocx
ocxはOLE Custom Controlの略で、OLEコントロールとかActiveXコントロール等と呼ばれる。

oleオートメーション インプロセスoleサーバー/アウトプロセスoleサーバ

oleメーションサーバーにはインプロセスoleサーバーとアウトプロセスoleサーバが存在し
インプロセスoleサーバーはActiveXDll,アウトプロセスoleサーバはActiveXExeとも呼ばれる。
インプロセスoleサーバーはoleクライアントのプロセス内で動作するのでDLLに含まれるが、アウトプロセスoleサーバはDLLでは無い。
ocxがVB等のFormに貼り付ける事で生成されGUIコンポーネントとして利用されるのに対して、oleメーションサーバーはコードによって生成され基本的にはGUIを持たないのでコードコンポーネントと呼ばれたりもする。

ActiveXコントロール

ActiveXコントロールが何を指すのか、いまいちあいまい。
ActiveX コントロール=ActiveX コンポーネント
IEのHTML画面やVBにおけるFormに埋め込み可能なコントロールであるocxのみを指しているのかと思いきや、oleオートメーションを含めてCOMオブジェクト全般を指すしている場合も。

  • Windows 2000 - Development Guide for Business Applications

    ActiveXとはCOMを使ったプログラムのことであり,ActiveXとCOMの唯一の違いは,自らレジストリにCOMの情報を登録する機能をもっているか否かである。
    ...
    Visual Basicで作成したCOMコンポーネントは,レジストリに対してCOMの情報を自動的に登録する機能をもつ。よって,Visual Basicで作成したCOMコンポーネントは,ActiveXでもある。そういった意味では,「COM=ActiveX」と思ってもらってかまわない。
    ただし,最近の風潮としては,ウィンドウを表示するようなユーザーインタフェースをもつものをActiveX,そうではなく,ユーザーインタフェースをもたず,ある機能だけを提供するものをCOM,と呼ぶようになってきている。

書いていて、ますます自分でもよくわからなくなってきた。
まあ、言葉の意味にとらわれていても次に進まないのでこのへんであきらめた。

.NET Coreで作られるDLL

驚いた事にVisualStudioで.NET CoreのコンソールアプリケーションをビルドしたらEXEでは無く拡張子.DLLのファイルが生成された。

アプリケーションプログラムなのにこれもDLLと呼ぶのだろうか。

ページのトップへ戻る