カスタム dll をロードするマルチスレッド アプリケーションがあります。
この dll では、ウィンドウを作成する必要があります。
私は新しいスレッドを作成することでそれを行っており、その中でこのウィンドウを作成しようとしていますが、エラーが発生しました: EInvalidOperation - Canvas does not allow drawing
.
ネットで検索したところ、そのスレッド用のカスタム メッセージ ポンプが必要であることがわかりました。
それで、私の質問は、これをどのように適切に行うのですか?
私が今していることは次のとおりです:
- 外部アプリがdllをロードしています - 別のスレッドのこのアプリがdllから関数を
呼び出しているよりも
-関数はスレッドを作成します
-次のように宣言されています: Init
Init
TMyThread
type
TMyThread = class(TThread)
private
Form: TMyForm;
FParentHWnd: HWND;
FRunning: Boolean;
protected
procedure Execute; override;
public
constructor Create(parent_hwnd: HWND); reintroduce;
end;
constructor TMyThread.Create(parent_hwnd: HWND);
begin
inherited Create(False); // run after create
FreeOnTerminate:=True;
FParentHWnd:=parent_hwnd;
FRunning:=False;
end;
procedure TMyThread.Execute;
var
parent_hwnd: HWND;
Msg: TMsg;
XRunning: LongInt;
begin
if not Terminated then begin
try
try
parent_hwnd:=FParentHWnd;
Form:=TMyForm.Create(nil); // <-- here is error
Form.Show;
FRunning:=True;
while FRunning do begin
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin
if Msg.Message <> WM_QUIT then
Application.ProcessMessages
else
break;
end;
Sleep(1);
XRunning:=GetProp(parent_hwnd, 'XFormRunning');
if XRunning = 0 then
FRunning:=False;
end;
except
HandleException; // madExcept
end;
finally
Terminate;
end;
end;
end;
例外EInvalidOperation - Canvas does not allow drawing
は、スレッドが既存のメッセージ ポンプ コードに到達する前に発生します。
私は何を間違っていますか、それを機能させる正しい方法は何ですか?
助けてくれてありがとう。
DLL で 2 番目の GUI スレッドを作成するには、標準アプリケーションとまったく同じように行う必要があります。
誰かが私の考えを確認できますか?
DLLbegin...end.
セクションでは、次のことを行います。
begin
Application.CreateForm(THiddenForm, HiddenForm);
Application.Run;
end.
私がしTMyThread.Execute
なければならないことで:
procedure TMyThread.Execute;
begin
if not Terminated then begin
try
try
Application.CreateForm(TMyForm, Form);
???? how to make a thread that has remained in this place until you close this window ???
except
HandleException; // madExcept
end;
finally
Terminate;
end;
end;
end;
これは正しい方法ですか?そんなに単純なのだろうか?