dll里面的form问题

Super.Jiju 2006-07-24 02:34:32

extern "C" void _stdcall D_Browse(void);
void __export __stdcall D_Browse(void)
{
F_Browse = new TF_Browse(NULL);
F_Browse->ShowModal();
delete F_Browse ;
}没有问题

由于我调用这个dll的form时是showmodal的
所以只有释放这个dll才能调用别的form

我改成
extern "C" void _stdcall D_Browse(void);
void __export __stdcall D_Browse(void)
{
F_Browse = new TF_Browse(Application);
F_Browse->Show();
}

并在dll的F_Browse的onclose事件里
delete F_Browse ;

但是调用时候(动态)
窗口一闪而过
好像刚生成就释放了

求救!!

...全文
354 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2006-12-28
  • 打赏
  • 举报
回复
mark
Super.Jiju 2006-07-25
  • 打赏
  • 举报
回复
明白这个问题了

在调用时候 if (hInst)
{ (FARPROC &)D_Browse =GetProcAddress(hInst,"D_Browse");
D_Browse();
FreeLibrary(hInst); }
else ShowMessage("Could not load DLL ");
FreeLibrary(hInst);


如果不是showmodal
他就直接执行下去了
FreeLibrary(hInst);了

此问题已经结贴
感谢 xiaoshi0(小鱼儿)
BlueDeepOcean(蓝色·深海)
希望能到QQ群BCB乐园9826518一叙.........
Super.Jiju 2006-07-24
  • 打赏
  • 举报
回复
:BlueDeepOcean(蓝色·深海)可以指点一下吗??

xiaoshi0(小鱼儿) 采用
在确定窗体不需要的时候调用如下方法:

HMODULE hModule = GetModuleHandle("Browse.dll");
FreeLibrary(hModule);

好的

估计问题就在这里了

xiaoshi0 2006-07-24
  • 打赏
  • 举报
回复
如果你在DllEntryPoint函数受到DLL_PROCESS_DETACH结果的时候将窗体删除了,应该就会出现你说的问题

如果你没有进行这样的操作,那么就会有内存泄漏

因为FreeLibrary并不能释放你的窗体的空间

你可以尝试不调用这个FreeLibrary

在确定窗体不需要的时候调用如下方法:

HMODULE hModule = GetModuleHandle("Browse.dll");
FreeLibrary(hModule);
BlueDeepOcean 2006-07-24
  • 打赏
  • 举报
回复
你调用过程错啦!
Super.Jiju 2006-07-24
  • 打赏
  • 举报
回复
BlueDeepOcean(蓝色·深海) :我后来把onclose里面的delete删除了还这样


xiaoshi0(小鱼儿) 代码都在上面了
采用动态调用的方式
代码如下:
void (*D_Browse)(void);
void __fastcall TMain::Brower1Click(TObject *Sender)
{


HINSTANCE hInst = NULL;
hInst = LoadLibrary("Browse.dll");
if (hInst)
{ (FARPROC &)D_Browse =GetProcAddress(hInst,"D_Browse");
D_Browse();
FreeLibrary(hInst); }
else ShowMessage("Could not load DLL ");
FreeLibrary(hInst);

}
xiaoshi0 2006-07-24
  • 打赏
  • 举报
回复
我没有看见你的程序,我不好说是因为什么一闪而过,可能是你代码写得有问题。

不论你是否提供手动删除的函数,都必须在Dll销毁的那一刻将你创建出来的窗体删除。
BlueDeepOcean 2006-07-24
  • 打赏
  • 举报
回复
一闪而过的意思是:Show了,之后又被你Close了。这连个过程在一起,就形成了一闪的结果了。
Super.Jiju 2006-07-24
  • 打赏
  • 举报
回复
BlueDeepOcean(蓝色·深海) :您的意思是我在建一个释放函数
谢谢 :xiaoshi0(小鱼儿)

现在我没有在onclose事件里面写

也就是show

但是一闪而过

不清楚为什么 ?

莫非不能show??
BlueDeepOcean 2006-07-24
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
TForm *DynGenForm;

extern "C" __declspec(dllexport) __stdcall void InvokeForm(void)
{
DynGenForm = new TForm(Application);
DynGenForm->Left = Screen->Width / 2;
DynGenForm->Top = Screen->Height / 2;
DynGenForm->Width = Screen->Width / 4;
DynGenForm->Height = Screen->Height / 4;
DynGenForm->Caption = "Dyanmic Generated Form";
DynGenForm->Visible = true;
}
extern "C" __declspec(dllexport) __stdcall void DestroyForm(void)
{
DynGenForm->Visible = false;
delete DynGenForm;
DynGenForm = NULL;
}
xiaoshi0 2006-07-24
  • 打赏
  • 举报
回复


extern "C" _declspec(dllexport) void _stdcall D_Browse(void);
void __stdcall D_Browse(void)
{
...
}
Super.Jiju 2006-07-24
  • 打赏
  • 举报
回复
现在我没有在onclose事件里面写

也就是show

但是一闪而过

不清楚为什么 ?

你可以将那个窗体的指针保存,等dll销毁的时候将该窗体delete就可以了。

注:函数在定义的时候不用加__export,要在声明的时候加,并且最好加这个:_declspec(dllexport)

没有明白
xiaoshi0 2006-07-24
  • 打赏
  • 举报
回复
首先第一个问题,你的窗体是模式的,只要关闭了这个窗体,那么dll的函数就退出了,你就可以运行其他的窗体了,这是正常的现象。

第二个问题,你动态创建了一个窗体,不能在OnClose事件中调用delete操作。因为这时你还在运行那个窗体呢。自己不能删除自己。

你可以将那个窗体的指针保存,等dll销毁的时候将该窗体delete就可以了。

注:函数在定义的时候不用加__export,要在声明的时候加,并且最好加这个:_declspec(dllexport)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧