あるProjectで関数を使用しています。
Dllにして、関数を呼び出していますが、あるところで例外になってしまいます。
Dllで呼び出さずProjectのUsesに設定して直接その関数を呼び出した場合、まったく例外はおこりません。
なにかDllで呼ぶ場合は注意しなければいけないことがあるのでしょうか?
よろしくお願いします。
呼び出し側とDLL側で呼び出し規約は合っていますか?
また、関数の引数や戻り値にStringや動的配列を使っていたり
一方で割り当てたメモリを他方で解放するような場合、
共有メモリマネージャを使う必要があります。
詳しくはヘルプでShareMemを調べてください。
torさん回答ありがとうございます。
例外が出ている場所ですが、Createしている場所で例外が発生しているようです。
Procedure Hoge;// ← DLL
Var
Test : TTest1;
begin
Test := TTest1.Create; ← ここで例外が発生している。
・
・
・
Test.Free;
Hogeは複数のスレッドで呼び出し繰り返し行っています。
このような状況です。
これを直接呼ぶと問題ないので、「DLLの関数として」がだめなようです。
Helpを見てもあまり理解できなかったのですが、
torさんの言っていることなどが原因で起こっていそうでしょうか?
TTest1.Create の中身にも問題があるのでしょう。
ホストアプリケーション側で
TTest1.Createにブレークポイントを設定し、トレース実行をしてみましょう。
DLLの実装の仕方にもいろいろあって、一概に言えないんですが
動的リンクの場合、LoadLibrary が成功したかどうかは最低限
確認しなければなりません。
GetProcAddress も正しくインポートできていないと、その関数・手続きは全く機能しません。
静的リンクと動的リンクでは、使えるようにするまでの手順が変わってきます。
uses に設定して動くが、動的な読み込みで動かないというのは
LoadLibraryが失敗しているかGetProcAddressが失敗している可能性が有ります。
その辺をデバッガで追ってみましょう。
また、忘れがちですが、呼び出し規約の指定は、宣言部、実現部の両方に必要です。
(implementation の前と後)
アドバイス等ありがとうございます。
少しデバックで追いながら、検証していきたいと思います。
ツイート | ![]() |