http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#dlluse
にかかれているようにして、DLLを動的インポートし最後に、FreeLibrary()で解放しようとしているのですが、FreeLibraryだけ実行されません。
その直前までは実行されています。
どうしてでしょうか?また、どうすれば、FreeLibraryを実行できるのでしょうか。DLLの動的インポートは初めてなのでよく分かりません。
ご教授お願いします。
あなたがどのように記事を参考にして、どのようなコードを書いたのかが分からなければ答えようがありません。
まずは周辺のソースを記述してください。
FreeLibraryの下にソースを書くと、そこまで実行されるようなら、
FreeLibraryでエラーが発生しているわけではなく、FreeLibrary以前のソースでエラーが発生しているかも。ww
DLLの関数呼び出しで、引数がPChar型なのに、そのまま文字列を''でくくって入れているとか....
はずしていたらスマソ
参考までに
静的インポートの場合は、読み込み解放自動ですので
なにもしなくていいです。
動的の場合は
あそこのサンプルには欠点があって
動的インポートでは
同じ関数内で 読み出す場合は、
成功の場合は、必ず解放するように書いてあげる必要があります
hLibrary:=LoadLibrary('example.dll'); //DLLを指定
if hLibrary<>0 then
try
。。。ここに処理
finally FreeLibrary(hLibrary);
end;
もしプロジェクトのどこかで読み込んで
どこで解放するかわからない場合は
DLLの保存用変数を用意して
form create時に 0に初期化して
どこかで解放したら 0に設定して
destory時に 読み込んであるのか解放してあるのか
チェックして 解放してなければ解放してあげるようにするといいです
エラーが起こりそうなところでは
try構文を使うようにするといいと思います
ああ、やっぱソース必要ですかね、、
そもそもこういうソースにムリがあるのかもしれないし、、、(スミマセン、DLLってどう値を渡してやればいいのかよく分からないもので、、、)
-----DLLのソース-----
function Load_ICONImage(const FileName: PChar; p: Pointer):boolean; var
ico : TICON;
begin
ico := TIcon.Create;
try
ico.LoadFromFile(FileName);
TBitmap(p).Width := GetSystemMetrics(SM_CXICON);
TBitmap(p).Height := GetSystemMetrics(SM_CYICON);
DrawIconEx(TBitmap(p).Canvas.Handle,0,0,ico.Handle,0,0,0,0,3);
result := true;
finally
ico.Free;
end;
end;
//こんなようなのを、他にPNGとJpegとGifでやってます。
exports
Load_ICONImage, Load_JPEGImage, Load_BITMAPImage, Load_PNGImage, Load_GIFImage;
begin
end.
で、実行ファイル側で
procedure TMain.OpenPictureFile(FileName : string);
type
TLoad_JPEGImage = function(const FileName: PChar; p: Pointer):boolean;
TLoad_PNGImage = function(const FileName: PChar; p: Pointer):boolean;
TLoad_GIFImage = function(const FileName: PChar; p: Pointer):boolean;
TLoad_ICONImage = function(const FileName: PChar; p: Pointer):boolean;
var
hLoadLib: THandle;
Load_JPEGImage: TLoad_JPEGImage;
Load_PNGImage : TLoad_PNGImage;
Load_GIFImage : TLoad_GIFImage;
Load_ICONImage: TLoad_ICONImage;
ext : string ;
bmp : TBitmap;
begin
ext := AnsiUpperCase(ExtractFileExt(FileName));
hLoadLib := LoadLibrary('LoadPicture.dll');
if hLoadLib = 0 then
begin
MessageBox(Handle,'DLLがない〜','Error',MB_OK or MB_ICONERROR);
Exit;
end;
bmp := TBitmap.Create;
try
if ext = '.BMP' then
begin
bmp.LoadFromFile(FileName);
end;
if (ext = '.JPG') or (ext = '.JPEG') then
begin
@Load_JPEGImage := GetProcAddress(hLoadLib,'Load_JPEGImage'); //関数をインポート
if @Load_JPEGImage <> nil then //関数があれば
begin
Load_JPEGImage(PChar(FileName),Pointer(bmp));
end;
end;
if ext = '.PNG' then
begin
@Load_PNGImage := GetProcAddress(hLoadLib,'Load_PNGImage');
if @Load_PNGImage <> nil then
begin
Load_PNGImage(PChar(FileName),Pointer(bmp));
end;
end;
if ext = '.GIF' then
begin
@Load_GIFImage := GetProcAddress(hLoadLib,'Load_GIFImage');
if @Load_GIFImage <> nil then
begin
Load_GIFImage(PChar(FileName),Pointer(bmp));
end;
end;
if ext = '.ICO' then
begin
@Load_ICONImage := GetProcAddress(hLoadLib,'Load_ICONImage');
if @Load_ICONImage <> nil then
begin
Load_ICONImage(PChar(FileName),Pointer(bmp));
end;
end;
Image1.Picture.Assign(bmp);
finally
bmp.Free;
FreeLibrary(hLoadLib);
ShowMessage('Freeされた?');
end;
end;
な感じにすると、bmpに画像がかかれて返ってくるかな〜とか思ってやってみたわけです。で、実行すると、finally節最後のShowMessage()は表示される前に固まってしまうんです。
ちなみに、try〜finallyは、私はCreateメソッドを使うときは必ず入れてます。で、止まってます。
どうか宜しくお願いします。
finally
bmp.Free;
FreeLibrary(hLoadLib);
は
finally
bmp.Free;
end;
finally
FreeLibrary(hLoadLib);
end;
別々にしたほうがいいです。
また、DLLの方に
export; かいてますか?
function Load_ICONImage(const FileName: PChar; p: Pointer):boolean; var
ico : TICON; export;
みたいに?
先に、
hLoadLib := LoadLibrary('LoadPicture.dll');
try
bmp := TBitmap.Create;
try
〜〜
finally
bmp.free;
end;
finally
FreeLibrary(hLoadLib);
end;
としましたが、変化ありません。
function Load_ICONImage(const FileName: PChar; p: Pointer):boolean; export;
var
ico : TICON;
begin
・・・
end;
ともしましたが変化なしです。
ツイート | ![]() |