ShowMessage で文字列を表示するには?

解決


歩如  2008-09-05 05:52:52  No: 31819

お世話になります。
早速ですが、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.

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


monaa  2008-09-06 04:11:32  No: 31820

http://groups.google.co.jp/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/1029d581ab12eae3
多分、DLLの中でSynchronizeは使えないんじゃないですかね?
てかDLLにしてSynchronizeって必要なんですか?
そんな状況が想像できません。


うんと  2008-09-07 05:09:21  No: 31821

DLL は、呼び出すexeとは独立してコンパイルされます。
たとえ同じバージョンのDelphiでコンパイルしても、実行時はexeとは同じ内容の
別のライブラリを参照していることになります。つまり、Syncronize は
使えません。(一般に、Delphiによって作られたアプリだけに呼び出される
と仮定されたDLLは動きません。クラスのインスタンスを渡せないのも同じ理由)


歩如  2008-09-10 20:58:47  No: 31822

ありがとうございます。

DLLを呼び出している側は
DLLの中でスレッドを使用している場合このスレッドから
エラーメッセージを表示するのに ShowMessage で表示したいのですが、
ShowMessage を呼び出す場合は Synchronize 処理にしないと
問題(空文字とかハングアップとか)が生じるのですが
このような場合はどうすればよいのでしょうか?


monaa  2008-09-11 01:44:05  No: 31823

試してませんが、
Synchronizeを外して、
Showmesasgeの箇所をMessageBoxにしてみてはどうでしょうか?
VCLにアクセスしているのが問題なのかもしれません。


歩如  2009-02-03 17:28:09  No: 31824

対応できないということで
今回はこれで終了します


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加