こんにちは、イマジオムの高木です。 いつもお世話に
なっております。
遊歩人さん:
> 尚、DLL側のコード抜粋は次の通りです。
>
> ---------------- DLL側
> var
> EditForm: TEditForm;
>
> hHandle: HWnd;
> hText : String;
>
> // フォームを表示
> procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・); stdcall;
> // フォームを閉じる
> procedure CloseEditForm; stdcall;
> // テキストを返す
> function GetRetText: PChar; stdcall;
>
> procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・);
> begin
> hHandle := Handle;
> hText := String(Text);
>
> EditForm := TEditForm.Create(Application);
> :
> EditForm.Show;
> end;
>
> procedure CloseEditForm;
> begin
> EditForm.Close;
> end;
>
> function GetRetText: PChar;
> begin
> Result := PChar(EditForm.Memo.Lines.Text);
> end;
> 現在の状況をお知らせします。皆さんのアドバイスは、
> 文字列渡しに原因があるのでは?と言うことでしたので、
> DLLとのインターフェースからすべて文字列定義を省いて
> 実行してみました。
>
> この状態で実行した結果ですが、やはり「access
> violation」エラーが発生してしまいます。
>
> 文字列渡しの部分は、後ほど皆さんのアドバイスを参考に
> 修正したいと思いますが、何か他に根本的に問題がある
> ような気がしております。
TEditForm.Create() の AOwner 引数に Application を
渡されていますが、これを nil にするとどうなりますか?
私の記憶が間違っているかもしれませんが、DLL内での
Application は呼び出し元と同じである保証はなかった
ように思います。
また作成したフォームはどのように破棄されていますか?
たとえばフォームで発生したイベントでフォーム自体を
破棄するようなことをすると、フォーム側ではイベントを
呼び出した後の戻り場所がなくなっていてアクセス違反が
発生することがあります。
> 例えば・・
> メインのVCLのスレッドから、動的リンクされたDLL側で
> キーボード入力可能なTMemoは使えないとか・・
> この様な場合、マルチスレッドにする必要があるとか・・
それは大丈夫です。 DLLの中でも、呼び出し元での
機能は一とおり使えると考えてかまいません。 たいていの
ことはできます。 上記の二つを疑ってみてください。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:
tarou_...@imageom.co.jp
ホームページ:
http://www.imageom.co.jp/
http://ad.freeml.com/cgi-bin/sa.cgi?id=pErF7
------------------------------------------------------[freeml byGMO]--