CrystalCPUID 5 -Estel- #10
今日もいそいそプログラミング… と。
OpenLibSys と CrystalCPUID の連携コードを書いている際に気が付いたことがあります。
WinRing0 には、RUN_TIME_DYNAMIC_LINKING と LOAD_TIME_DYNAMIC_LINKING それぞれに対応するライブラリ初期化ルーチンが付属しているのですが、RUN_TIME_DYNAMIC_LINKING 用の OlsApiInit.h を使用してライブラリの初期化を行っても、他のファイルから API を呼び出せないという問題があることに気がつきました。サンプルプログラムは、ひとつのダイアログで完結していたので気が付かなかった…。考えてみると当たり前なのですが。
OlsApiIni.h はグローバル空間に WinRing0 API を展開し初期化するため、他のファイルから API を呼び出すためには、extern “API 名” してあげないと参照できません。
例:GetDllStatus() の場合
typedef DWORD (WINAPI *_GetDllStatus) ();
extern _GetDllStatus GetDllStatus;
もちろん、OlsApiInitExtern.h を作って、extern しまくれば解決するわけですが…。英語で状況を説明してマニュアルを書くのは大変です。というわけで、仕様というか初期化ルーチンはオマケですから。
リンク方式の使い分け (MSDN) というわけで、複数のファイルから WinRing0 API を使用する場合は、暗黙的リンク (LOAD_TIME_DYNAMIC_LINKING) を推奨の方向で…。
【2007/12/24 11:12 追記】
OlsApiInitExt.h と OlsApiInitDef.h を作成し、RUN_TIME_DYNAMIC_LINKING においても、複数のファイルから WinRing0/OpenLibSys API を使用できるようにしました。サンプルプログラムも更新しなければならないので、何かのついでに更新したいと思います。
最近のコメント