◆ [Delphi] exeで利用するDLLを動的にリンクさせる (「DLLが見つかりません」エラーを出させない)
どーもボキです。

DLLに動的にリンクさせる方法があるってことは前から知ってたんだけど、食わず嫌いで使ったことなかった。
どうしても使う必要が出たからやってみると、意外に簡単で目からうろこ。なので紹介。

exeがDLLに静的リンクしている場合、exeの実行にはリンクしたDLLが必須になる。だから、
 「このユニットを使えば開発が楽なんだよなぁ、でもDLLを静的に呼び出してるな…。
  今回のexe開発じゃDLLの関数を全然使わないけど、しょうがないDLLも一緒に配布すっか。」
ってなことになる。DLLも一緒に配布せんと、
 「***.dllが見つからんけぇ、exeが実行出来んで」 ってエラーが出る。

そんなときは、DLLに動的にリンクさせればいい。DLLがあればDLLにリンクするし、なければリンクしない。
要するに、DLLがなくても「DLL見つかんねぇ」 エラーが出ない。やり方は以下。
var
hDLL : Integer;
DLLFunc : procedure(i : Integer) cdecl; // 利用するDLL関数を定義


// 起動時にDLLのハンドル取得
Initialization
begin

DLLFunc := nil;
hDLL := LoadLibrary('DLLName.dll');

if hDLL = 0 then exit; // DLLが見つからない

DLLFunc := GetProcAddress(hDLL,'DLL_FuncName');
end;



// 終了時にDLLのハンドル開放

Finalization
begin

if hDLL = 0 then exit;

FreeLibrary(hDLL);
end;
DLLName.dll は DLLファイル名。DLL_FuncName は DLL内の呼び出したい関数名。簡単じゃろう?


注意が3つ。

1.DLL関数が呼び出せるかどうかチェックすること
  DLLが見つからない・呼び出し関数が取得できていない時に、DLL関数を実行するとメモリアクセスエラーになる。
  以下のように、DLL関数の実行前にチェックすること。
  if DLLFunc = nil then exit;  // DLL関数 = nil なら、DLLから関数が取得できていない

DLLFunc(i);
2.関数変数(DLLFunc)の定義は、DLL内の呼び出し規約に合わせること
  上の例では、cdecl のこと。

3.DLL関数を取得したい場合は、DLLをパスが通ったフォルダに保存すること
exeと同じフォルダとか、パスを通したフォルダとかね。

[PR]
by yozda | 2009-01-31 21:51 | プログラミング | Trackback | Comments(0)
トラックバックURL : http://yozda.exblog.jp/tb/7882150
トラックバックする(会員専用) [ヘルプ]
<< [日記] 五日市までドライブ [苦言] 毎日定時で帰るのに疲... >>