G
gengxinxing
Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中使用多线程编程、DLL中如何创建窗体,这两个方面的文章网上非常多,我这里要说的是我在网上所没有找到的:
每一个插件就是一个DLL,里面都有窗体,加载插件的时候,需要为每一个插件分配一个线程。
在这种情况下,网上的代码就无能为力了,你将会发现一些问题:
1,非模态窗体只是闪烁一下又消失了;
2,模态窗体一直显示,也能处理各种窗体消息,但是主程序无法结束该线程;
3,如果没有结束线程,主程序退出时可能报非法引用内存错误;
4,……
总之,内存错误、程序不稳定之类的麻烦一大堆。
如下 就在退出时报内存错误
extern "C" BOOL FAR PASCAL EXPORT Initialize(const HWND hwnd) //设备初始化,提供主窗体句柄
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hMain = hwnd;
Dlg.Create(IDD_HKVISION_DIALOG, NULL);
Dlg.ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
//////////////////////////////////////////////////////////////////
var
m_hwndparent:HWND;
m_initializeparm:integer;
TInitialize=function(const hw:HWND):integer;stdcall;
m_hwndparent:=application.Handle;
if @m_initialize<>nil then
begin
m_initializeparm:=m_initialize(m_hwndparent);
end;
每一个插件就是一个DLL,里面都有窗体,加载插件的时候,需要为每一个插件分配一个线程。
在这种情况下,网上的代码就无能为力了,你将会发现一些问题:
1,非模态窗体只是闪烁一下又消失了;
2,模态窗体一直显示,也能处理各种窗体消息,但是主程序无法结束该线程;
3,如果没有结束线程,主程序退出时可能报非法引用内存错误;
4,……
总之,内存错误、程序不稳定之类的麻烦一大堆。
如下 就在退出时报内存错误
extern "C" BOOL FAR PASCAL EXPORT Initialize(const HWND hwnd) //设备初始化,提供主窗体句柄
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hMain = hwnd;
Dlg.Create(IDD_HKVISION_DIALOG, NULL);
Dlg.ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
//////////////////////////////////////////////////////////////////
var
m_hwndparent:HWND;
m_initializeparm:integer;
TInitialize=function(const hw:HWND):integer;stdcall;
m_hwndparent:=application.Handle;
if @m_initialize<>nil then
begin
m_initializeparm:=m_initialize(m_hwndparent);
end;