DLLの解放を実行させるには???


初心者A  2005-03-17 23:09:19  No: 13819

http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#dlluse
にかかれているようにして、DLLを動的インポートし最後に、FreeLibrary()で解放しようとしているのですが、FreeLibraryだけ実行されません。
その直前までは実行されています。
どうしてでしょうか?また、どうすれば、FreeLibraryを実行できるのでしょうか。DLLの動的インポートは初めてなのでよく分かりません。
ご教授お願いします。


たかみちえ  URL  2005-03-17 23:44:19  No: 13820

あなたがどのように記事を参考にして、どのようなコードを書いたのかが分からなければ答えようがありません。
まずは周辺のソースを記述してください。


  2005-03-18 01:33:36  No: 13821

FreeLibraryの下にソースを書くと、そこまで実行されるようなら、
FreeLibraryでエラーが発生しているわけではなく、FreeLibrary以前のソースでエラーが発生しているかも。ww
DLLの関数呼び出しで、引数がPChar型なのに、そのまま文字列を''でくくって入れているとか....
はずしていたらスマソ


  2005-03-18 01:39:11  No: 13822

参考までに
静的インポートの場合は、読み込み解放自動ですので
なにもしなくていいです。

動的の場合は
あそこのサンプルには欠点があって

動的インポートでは
同じ関数内で  読み出す場合は、
成功の場合は、必ず解放するように書いてあげる必要があります

hLibrary:=LoadLibrary('example.dll'); //DLLを指定
 if hLibrary<>0 then
try
。。。ここに処理
 finally FreeLibrary(hLibrary);
 end;

もしプロジェクトのどこかで読み込んで
どこで解放するかわからない場合は
DLLの保存用変数を用意して
form  create時に 0に初期化して
どこかで解放したら 0に設定して
destory時に  読み込んであるのか解放してあるのか
チェックして  解放してなければ解放してあげるようにするといいです

エラーが起こりそうなところでは
try構文を使うようにするといいと思います


初心者A  2005-03-18 02:11:35  No: 13823

ああ、やっぱソース必要ですかね、、
そもそもこういうソースにムリがあるのかもしれないし、、、(スミマセン、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メソッドを使うときは必ず入れてます。で、止まってます。
どうか宜しくお願いします。


  2005-03-18 02:23:39  No: 13824

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;
みたいに?


初心者A  2005-03-18 02:43:56  No: 13825

先に、
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;

ともしましたが変化なしです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加