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

解決


インシ  2010-08-11 09:34:08  No: 38969  IP: 192.*.*.*

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

よろしくお願いします。

編集 削除
tor  2010-08-11 13:41:15  No: 38970  IP: 192.*.*.*

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

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

編集 削除
インシ  2010-08-11 14:37:39  No: 38971  IP: 192.*.*.*

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

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

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

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

編集 削除
通りすがり  2010-08-20 00:01:31  No: 38972  IP: 192.*.*.*

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

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


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

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

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

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

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

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

編集 削除
インシ  2010-08-20 11:46:03  No: 38973  IP: 192.*.*.*

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

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

編集 削除