DLLを2回実行させるには?


レンジャー  2005-12-08 21:36:30  No: 19133  IP: 192.*.*.*

以下のようなプログラムを作ったのですが、
実行すると、2回目が実行されません。
どうしてでしょうか?

≡≡  EXE側  ≡≡
type
  TTestStart = function : TModalResult; stdcall;

var
  RetCode:    TModalResult;
  Handle:     THandle;
  TestStart:  TTestStart;

begin
  //  起動時にファイルのバージョンアップを確認する
  while True do begin
    RetCode  := mrNo;
  //  DLLを呼び出して実行する
    Handle  := LoadLibrary('Test.dll');
    if Handle <> 0 then begin
      @TestStart := GetProcAddress(Handle, 'TestStart');
      if @TestStart <> Nil then begin
        RetCode := TestStart;
        FreeLibrary(Handle);
      end;
    end;
    if RetCode = mrYes then Continue;
    break;
  end;


≡≡  DLL側  ≡≡

function TestStart: TModalResult; stdcall; export
begin
  Form1 := TForm1.Create(Nil);
  Result := Form1.ShowModal;
  Form1.Free;
end;

exports
  TestStart;

begin
end.

編集 削除
りおりお  2005-12-08 22:10:35  No: 19134  IP: 192.*.*.*

> Handle := LoadLibrary('Test.dll');

これを

Handle := LoadLibrary(ExtractFilePath(ParamStr(0))'+'Test.dll');

にしてみるとか

編集 削除
りおりお  2005-12-08 23:36:13  No: 19135  IP: 192.*.*.*

ようするに dll があるところまでのフルパスをつかう、ということです。

編集 削除
レンジャー  2005-12-09 08:54:57  No: 19136  IP: 192.*.*.*

りおりおさん、
どうも、ありがとうございます。

どうやら、DLL側でエラーが出ているようです。
  Form1 := TForm1.Create(Nil);
が実行できないみたいなのですが
お手数をおかけします。

編集 削除
にしの  2005-12-09 10:24:47  No: 19137  IP: 192.*.*.*

私の環境では上のソースで動きましたよ。
# Delphi7Pro/Windows XP Pro+SP2

TForm1.Createでエラーになるのなら、EXE側のApplicationをDLL側に代入してみてはどうでしょう。

TestStart:...を、TestStart(App: TApplication):...に変更して、
begin
  Application := App;
としてみるとか。

編集 削除