お世話になります。
早速ですが、DLLを呼び出して
DLLでスレッドを作成し、Synchronize を 使用して
ShowMessage で文字列を表示しようとしています。
以下、テストプログラムを作りましたが、
動作しません。
Execute までは動いているようですが
DebugMessage が実行されません。
対処方法を教えてください。
−−−−−−−−−−−−−−−−−−−−−−−−−
unit TestMain;
interface
uses
Windows, Classes, Controls, StdCtrls, Forms;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
TCallTest = procedure; stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
TH: THandle;
CallTest: TCallTest;
begin
TH := LoadLibrary('TestDll.Dll');
if TH <> 0 then begin
@CallTest := GetProcAddress(TH, 'CallTest');
if @CallTest <> nil then CallTest;
end;
end;
end.
−−−−−−−−−−−−−−−−−−−−−−−−−
library testDll;
uses
SysUtils, Classes, Dialogs;
{$R *.res}
type
TTestDll = class(TThread)
private
FMessage: AnsiString;
procedure DebugMessage;
protected
procedure Execute; override;
public
constructor Create(MesStr: String);
end;
constructor TTestDll.Create(MesStr: String);
begin
inherited Create(false);
FMessage := MesStr;
FreeOnTerminate := true;
end;
procedure TTestDll.DebugMessage; begin ShowMessage(FMessage); end;
procedure TTestDll.Execute; begin Synchronize(DebugMessage); end;
procedure CallTest; stdcall; export;
begin
TTestDll.Create('ボタンを押した');
end;
exports
CallTest;
begin
end.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
http://groups.google.co.jp/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/1029d581ab12eae3
多分、DLLの中でSynchronizeは使えないんじゃないですかね?
てかDLLにしてSynchronizeって必要なんですか?
そんな状況が想像できません。
DLL は、呼び出すexeとは独立してコンパイルされます。
たとえ同じバージョンのDelphiでコンパイルしても、実行時はexeとは同じ内容の
別のライブラリを参照していることになります。つまり、Syncronize は
使えません。(一般に、Delphiによって作られたアプリだけに呼び出される
と仮定されたDLLは動きません。クラスのインスタンスを渡せないのも同じ理由)
ありがとうございます。
DLLを呼び出している側は
DLLの中でスレッドを使用している場合このスレッドから
エラーメッセージを表示するのに ShowMessage で表示したいのですが、
ShowMessage を呼び出す場合は Synchronize 処理にしないと
問題(空文字とかハングアップとか)が生じるのですが
このような場合はどうすればよいのでしょうか?
試してませんが、
Synchronizeを外して、
Showmesasgeの箇所をMessageBoxにしてみてはどうでしょうか?
VCLにアクセスしているのが問題なのかもしれません。
対応できないということで
今回はこれで終了します
ツイート | ![]() |