首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

DLL里面创建的窗体怎么释放的

2012-02-28 
DLL里面创建的窗体如何释放的?我的dll导出函数里面创建了一个窗体:externC __declspec(dllexport)__stdc

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會更好。
[解决办法]
学习下

热点排行