我有加载我的自定义 dll 的多线程应用程序。
在这个 dll 中,我需要创建一个窗口。
我正在通过创建新线程来做到这一点,并在其中尝试创建此窗口,但是我收到错误消息告诉我:EInvalidOperation - Canvas does not allow drawing
。
通过在网上搜索,我发现我需要为该线程定制消息泵。
所以,我的问题是,如何正确地做到这一点?
我现在要做的是:
- 外部应用程序正在加载 dll
- 比单独线程中的这个应用程序Init
从 dll 调用函数
-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 中创建第二个 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;
这是正确的方法吗?会不会这么简单?