同じ処理でDllにすると例外が発生する

解決


インシ  2010-08-11 18:34:08  No: 38969

あるProjectで関数を使用しています。
Dllにして、関数を呼び出していますが、あるところで例外になってしまいます。
Dllで呼び出さずProjectのUsesに設定して直接その関数を呼び出した場合、まったく例外はおこりません。
なにかDllで呼ぶ場合は注意しなければいけないことがあるのでしょうか?

よろしくお願いします。


tor  2010-08-11 22:41:15  No: 38970

呼び出し側とDLL側で呼び出し規約は合っていますか?

また、関数の引数や戻り値にStringや動的配列を使っていたり
一方で割り当てたメモリを他方で解放するような場合、
共有メモリマネージャを使う必要があります。
詳しくはヘルプでShareMemを調べてください。


インシ  2010-08-11 23:37:39  No: 38971

torさん回答ありがとうございます。

例外が出ている場所ですが、Createしている場所で例外が発生しているようです。

Procedure Hoge;// ←  DLL
Var
  Test : TTest1;
begin
  Test := TTest1.Create; ←  ここで例外が発生している。
      ・
      ・
      ・
  Test.Free;

Hogeは複数のスレッドで呼び出し繰り返し行っています。
このような状況です。
これを直接呼ぶと問題ないので、「DLLの関数として」がだめなようです。
Helpを見てもあまり理解できなかったのですが、
torさんの言っていることなどが原因で起こっていそうでしょうか?


通りすがり  2010-08-20 09:01:31  No: 38972

TTest1.Create の中身にも問題があるのでしょう。

ホストアプリケーション側で
TTest1.Createにブレークポイントを設定し、トレース実行をしてみましょう。

DLLの実装の仕方にもいろいろあって、一概に言えないんですが
動的リンクの場合、LoadLibrary が成功したかどうかは最低限
確認しなければなりません。

GetProcAddress も正しくインポートできていないと、その関数・手続きは全く機能しません。

静的リンクと動的リンクでは、使えるようにするまでの手順が変わってきます。

uses に設定して動くが、動的な読み込みで動かないというのは
LoadLibraryが失敗しているかGetProcAddressが失敗している可能性が有ります。

その辺をデバッガで追ってみましょう。

また、忘れがちですが、呼び出し規約の指定は、宣言部、実現部の両方に必要です。
(implementation の前と後)


インシ  2010-08-20 20:46:03  No: 38973

アドバイス等ありがとうございます。

少しデバックで追いながら、検証していきたいと思います。


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

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






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