DLL里面创建的窗体如何释放的?
我的dll导出函数里面创建了一个窗体:
extern "C " __declspec(dllexport) __stdcall void CREATE_LPY_FORM(struct _dllformprameter &su)
{
if ( NULL == SaveApp ) // 保存 Application,传递 Application
{
SaveApp = Application;
Application =su.app_parentapp ;
}
Tfm_lpy *fm=new Tfm_lpy(su.app_parentapp );
fm-> h_main =su.h_parentfm;
fm-> Parent =su.wctl_parent ;
fm-> Left =0;
fm-> Top =0;
fm-> Width =su.wctl_parent-> Width;
fm-> Height =su.wctl_parent-> Height;
SendMessage(su.h_parentfm,WM_MYMESSAGE,MSG_RETURN_MY_HANDLE,(long&)fm-> Handle);
//ShowMessage(IntToStr(fm-> Handle));
fm-> Show();
}
窗体的关闭事件里面写:
void __fastcall Tfm_lpy::FormClose(TObject *Sender, TCloseAction &Action)
{
SendMessage(h_main,WM_MYMESSAGE,MSG_RETURN_MYCLOSEED ,(long&)this-> Handle );
Action=caFree;
}
为什么用CodeGuard 出现多个Resource leak?
[解决办法]
extern "C " __declspec(dllexport) void __stdcall ShowImage(void)
{
TForm2* Form2 = new TForm2(NULL);
Form2-> ShowModal();
delete Form2;
}
[解决办法]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hInst;
String sPath = ExtractFilePath(Application-> ExeName);
String FileName = sPath+ "SimpleWinDll.dll ";
hInst = LoadLibrary(FileName.c_str());
if (hInst == NULL)
return;
void (*ShowImage)(void) = NULL;
(FARPROC &)ShowImage=GetProcAddress(hInst, "ShowImage ");
if (ShowImage != NULL)
ShowImage();
else
ShowMessage( "No ");
FreeLibrary(hInst);
}
[解决办法]
D L L的一个好处在于用一种开发工具创建的D L L可以用于另一不同的开
发工具编写的程序使用。当在调用应用程序中使用了包含了V C L组件(比如
窗体)的D L L,则必须提供输出接口路径以用于标准的传统调用来避免C + +
名称不匹配,并且不需要所调用的应用程序支持V C L库。为了创建能够输出
的V C L组件,可使用运行时程序包,有关信息可以参阅第1 0章。
比如,假设要创建一个D L L,显示如下简单的对话框(如图3 - 1所示)。
这个对话框D L L的代码如下:
34计计第一部分使用C++Builder编程
下载
图3-1 一个简单的对话框
这个例子代码显示对话框,并在Ye s按钮被按下时在私有数据成员r e t u r n Va l u e中存储t r u e值,否则,
r e t u r n Va l u e值为f a l s e。公用的G e t R e t u r n Va l u e()函数接收r e t u r n Va l u e的当前值。
为了调用这个对话框, 并确定是哪一个按钮被按下,调用的应用程序调用输出函数
I n v o k e Ye s N o D i a l o g()。这个函数作为C链(以避免C + +名称不匹配)和标准的传统C调用的一个输出函
数在D L L M A I N . H中声明,在D L L M A I N . C P P中定义。
在D L L中使用标准的C函数作为接口,不管是否是用C + + B u i l d e r创建的,任意调用的应用程序都能使
用这个D L L。要求支持这个对话框的V C L功能被链接入D L L本身,而所调用的应用程序不需要了解它的
任何东西。
要注意的是,当创建了一个V C L的D L L时,所需的V C L组件被链接入D L L,将导致一定量的越界
第3章创建应用程序、组件和程序库计计35
下载
(o v e r h e a d),通过将几个组件结合进一个只需要V C L支持组件的一个备份的D L L中可以压缩这种越界,这
将使应用程序的大小最小化。
[解决办法]
注意 在哪申的存,就在哪哪析放。就少很多。
在DLL中NEW的,最好在DLL中DELETE,最可靠。因上DLL就是用共享的,你不知道DLL用它,也不知道用者使用什程工具。如果你定死了你的DLL只能用BCB用,那使用BPL更好。
[解决办法]
学习下