我编写的程序:
----Resouse.dll-----
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "ResouseDml.h"
#include "ResouseFrm.h"
#include "../Include/Module.h"
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
Dml_Resouse = new TDml_Resouse(Application);
break;
case DLL_PROCESS_DETACH:
delete Dml_Resouse;
CoUninitialize();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
//------------------------------------------------------------------------
void __stdcall ShowResouse(TADOConnection *Conn)//申明文件我
{
Dml_Resouse->Qry_Resouse->Connection = Conn;
Frm_Resouse = new TFrm_Resouse(Application);
Frm_Resouse->ShowModal();
delete Frm_Resouse;
Dml_Resouse->Qry_Resouse->Connection = NULL;
}
//------------------------------------------------------------------------
---------Module.h---------
extern "C" __declspec(dllexport) void __stdcall ShowResouse(TADOConnection *Conn);
主程序将ADOConnection传递到DLL内,进行数据库的查询,当我关闭主程序的时候,总是报错,An exception(C0000005) occurred during DllEntryPoint or DllMain in module:Resouse.dll
当我把delete Dml_Resouse;注释掉以后问题解决。
请问,我在没有注释掉delete Dml_Resouse;之前哪里出错了?如果不将Dml_Resouse删除,我该怎么解决这个问题?
谢谢!
我的DLL
case DLL_PROCESS_DETACH:
delete dmdb_drth;
dmdb_drth=NULL;
CoUninitialize();
break;
没有问题,是不是你的那个Dml_Resouse指针的值改变了
你在DLL里delete Dml_Resouse;这句设断点,连exe调试一下,看看为什么出错
Dml_Resouse = new TDml_Resouse(Application);
在BC中,使用new操作符要特别注意参数
你用Application作为参数,就是说明由工程管理Dml_Resouse实例;就是说在系统退出时Dml_Resouse会由系统自动析够
解决方法有两个:一是不要析够;另一个创建实例时不要带参数:
Dml_Resouse = new TDml_Resouse(NULL);
Dml_Resouse = new TDml_Resouse(Application);
这句话有问题,在DLL中没有Application这个变量。
在DLL中一般:Dml_Resouse = new TDml_Resouse(NULL);