Last Updated 2002/03/15
Visual C++ DLL
16bit DLL
2002/03/15

1.AFXDLL とは何か?

AFXDLL とは,実は DLL のことではなく DLL 版の MFC を使う EXE/DLL のこと.
これから作るプログラムが EXE であろうが DLL であろうが,DLL 版の MFC を使いたいなら,それは AFXDLL です.
MFC をスタティックにリンクする DLL は,AFXDLL ではなく USRDLL と呼ばれる.


2.DLL 版の MFC

MFCは,多くのことをアプリケーションクラス(CWinApp の派生クラス)に依存している.
アプリケーションのメインウィンドウ(普通 CMainFrame クラス)を管理している(というか,ポインタを保持している)のもアプリケーションクラス.

複数のアプリケーションから共有される DLL 版の MFC は,どうやって個々のアプリケーションクラスを見つけるのでしょうか?

それは,スタックセグメントを使う.
こそくなことに,DLL 版 MFC は,スタックセグメントのオフセット 0x10 からの領域を,勝手に使用する.その中には,アプリケーションクラスのオブジェクトのポインタを始め,重要なデータが大量に入っている.
このスタックセグメントの領域はいつ設定されるのでしょうか?
これは MFC が提供する WinMain() から呼ばれる関数が行う.

MFC 版 DLL はアプリケーション(EXE)に強く依存している.


3.MFC 拡張 DLL

MFC 拡張 DLL とは,DLL 版 MFC を使用する,私たちが作る DLL です.
つまり,AFXDLL の内で DLL のことです。

MFC 拡張 DLL は,MFC の機能のほとんどを使える.AfxGetApp() でアプリケーションクラスのポインタを取得することもできる.これは、DLL 版 MFC のおかげです.
その結果,MFC 拡張 DLL もアプリケーション(EXE)に強く依存する.これは,MFC 拡張 DLL を使用するアプリケーションも AFXDLL であることを義務づける.

これを図で表す.

    +---------------------+   +---------------------+
    |                     |   |                     |
    |     AFXDLLなEXE     |   |   AFXDLLでないEXE   |
    |                     |   |                     |
    +---------------------+   +---------------------+
      |             |               |             |
      |使用可       |使用可         |使用不可     |使用不可
      |             V               V             |
      |   +---------------------------------+     |
      |   |                                 |     |
      |   |          AFXDLLなDLL            |     |
      |   |         (MFC拡張DLL)            |     |
      |   |                                 |     |
      |   +---------------------------------+     |
      |             |                             |
      |             |使用可                       |
      V             V                             V
    +-----------------------------------------------+
    |                                               |
    |                       DLL版MFC                |
    |                  (MFC250D.DLLなど)            |
    |                                               |
    +-----------------------------------------------+


4.USRDLL

DLL 版 MFC ではなく,MFC をスタティックにリンクする DLL を作ることができる.
これが USRDLL.
USRDLL は,AFXDLL な EXE/DLL および AFXDLL でない EXE/DLL から使用できる.
しかし,USRDLL から,DLL 版 MFC,MFC 拡張 DLL を使用することはできない.

不特定のアプリケーションから使用される DLL で,MFC を使用したいのなら USRDLL にするしかない.



DLL 版 MFC および MFC 拡張 DLL は,EXE 側のヒープを使用するので注意が必要.
つまり,EXE が AFXDLL でないと、new、malloc()などもうまくいかない.
AFXDLL(EXE/DLL とも)で複数アプリケーションで共有するメモリを割り当てるには,GlobalAlloc() を使うことになる.


参照
前後のTips
16bit DLL

DSS ProgrammingTipsCGI Ver1.02