一个DLL调用ACCESS库的奇怪有关问题(有源码,帮调试下,谢 )
一个DLL调用ACCESS库的奇怪问题(有源码,帮调试下,谢 )
调用DLL,DLL功能就是连接库、打开表,分开调用,也就是一个按钮调用一个函数没有问题,但三个函数合在一个按钮调用就会出错,不知怎么回事?编译没问题,哪个老大帮调试下,谢谢
DLL:
#include <ADODB.hpp>
#include <DB.hpp>
extern "C"__declspec(dllexport) int _stdcall LinkDatabase(TADOConnection *m_AccessConn,String m_DatabaseFile,String m_Pwd="");
extern "C"__declspec(dllexport) bool _stdcall Connection1(TADOConnection *m_AccessConn,TADOQuery *m_Query);
extern "C"__declspec(dllexport) int _stdcall OpenTable(TADOQuery *m_Query,String m_TableName,int m_Flag=0,String m_SQL="");
//=========================
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH:
CoUninitialize();
break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
default:
break;
}
return 1;
}
//---------------------------------------
int LinkDatabase(TADOConnection *m_AccessConn,String m_DatabaseFile,String m_Pwd)
{
WideString Link;
if(m_AccessConn==NULL)
return -1;
if(m_DatabaseFile.Trim().Length()==0)
return -2;
if(FileGetAttr(m_DatabaseFile) & faReadOnly==faReadOnly)
FileSetAttr(m_DatabaseFile,0);
Link="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_DatabaseFile+";\
User ID=admin;Jet OleDb:Database Password="+m_Pwd;
if(m_AccessConn->Connected==false) //如果没有连接到Access
{
try
{
m_AccessConn->ConnectionString=Link;
m_AccessConn->LoginPrompt=false;
m_AccessConn->Connected=true;
return 0;
}
catch(...)
{
return -100;
}
}
return -100;
}
//-----------------------------------------
bool Connection1(TADOConnection *m_AccessConn,TADOQuery *m_Query)
{
if(m_AccessConn==NULL || m_Query==NULL)
return false;
m_Query->Connection=m_AccessConn;
m_AccessConn->Connected=true;
return true;
}
//-----------------------
int OpenTable(TADOQuery *m_Query,String m_TableName,int m_Flag,String m_SQL)
{
String m_str;
if(m_Query==NULL)
return -1;
if(m_TableName.Trim().Length()==0)
return -2;
m_Query->Close(); m_Query->SQL->Clear();
switch(m_Flag)
{
case 0:
default:
m_str="Select * From "+m_TableName;
break;
case 1:
m_str=m_SQL;
break;
}
try
{
m_Query->SQL->Add(m_str);
m_Query->Active=true;
m_Query->Open();
}
catch(...)
{
return -100;
}
return m_Query->RecordCount;
}
//-----------------------------------------
调用:
HINSTANCE hDLL;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hDLL=LoadLibrary("Database.dll");
}
//----------------------------------------Database.dll-----------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)//一个按钮连续调用三个函数有问题,但分开三个按钮分别调用就没问题,不知怎么回事?错误提示:EAccessViolation
调用DLL,DLL功能就是连接库、打开表,分开调用,也就是一个按钮调用一个函数没有问题,但三个函数合在一个按钮调用就会出错,不知怎么回事?编译没问题,哪个老大帮调试下,谢谢
DLL:
#include <ADODB.hpp>
#include <DB.hpp>
extern "C"__declspec(dllexport) int _stdcall LinkDatabase(TADOConnection *m_AccessConn,String m_DatabaseFile,String m_Pwd="");
extern "C"__declspec(dllexport) bool _stdcall Connection1(TADOConnection *m_AccessConn,TADOQuery *m_Query);
extern "C"__declspec(dllexport) int _stdcall OpenTable(TADOQuery *m_Query,String m_TableName,int m_Flag=0,String m_SQL="");
//=========================
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH:
CoUninitialize();
break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
default:
break;
}
return 1;
}
//---------------------------------------
int LinkDatabase(TADOConnection *m_AccessConn,String m_DatabaseFile,String m_Pwd)
{
WideString Link;
if(m_AccessConn==NULL)
return -1;
if(m_DatabaseFile.Trim().Length()==0)
return -2;
if(FileGetAttr(m_DatabaseFile) & faReadOnly==faReadOnly)
FileSetAttr(m_DatabaseFile,0);
Link="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_DatabaseFile+";\
User ID=admin;Jet OleDb:Database Password="+m_Pwd;
if(m_AccessConn->Connected==false) //如果没有连接到Access
{
try
{
m_AccessConn->ConnectionString=Link;
m_AccessConn->LoginPrompt=false;
m_AccessConn->Connected=true;
return 0;
}
catch(...)
{
return -100;
}
}
return -100;
}
//-----------------------------------------
bool Connection1(TADOConnection *m_AccessConn,TADOQuery *m_Query)
{
if(m_AccessConn==NULL || m_Query==NULL)
return false;
m_Query->Connection=m_AccessConn;
m_AccessConn->Connected=true;
return true;
}
//-----------------------
int OpenTable(TADOQuery *m_Query,String m_TableName,int m_Flag,String m_SQL)
{
String m_str;
if(m_Query==NULL)
return -1;
if(m_TableName.Trim().Length()==0)
return -2;
m_Query->Close(); m_Query->SQL->Clear();
switch(m_Flag)
{
case 0:
default:
m_str="Select * From "+m_TableName;
break;
case 1:
m_str=m_SQL;
break;
}
try
{
m_Query->SQL->Add(m_str);
m_Query->Active=true;
m_Query->Open();
}
catch(...)
{
return -100;
}
return m_Query->RecordCount;
}
//-----------------------------------------
调用:
HINSTANCE hDLL;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hDLL=LoadLibrary("Database.dll");
}
//----------------------------------------Database.dll-----------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)//一个按钮连续调用三个函数有问题,但分开三个按钮分别调用就没问题,不知怎么回事?错误提示:EAccessViolation