我想用DLL访问数据库及其表,并返回一个数据集,请帮忙看一下出错原因及解决方法.编译通过,调用时出错.
调用DLL的程序如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SUIButton, ExtCtrls, SUIForm, StdCtrls, Buttons, DB, ADODB,
Grids, DBGrids;type
TForm1 = class(TForm)
suiForm1: TsuiForm;
btnShowForm: TsuiButton;
Connet: TBitBtn;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
procedure btnShowFormClick(Sender: TObject);
procedure ConnetClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String;AHandle:THandle):Boolean;stdcall; external'ConnectDatabase.dll';
procedure ShowForm(AHandle: THandle);stdcall;external'ConnectDatabase.dll';
implementation{$R *.dfm}procedure TForm1.btnShowFormClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
ShowForm(AHandle);
end;procedure TForm1.ConnetClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
if ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle) then
MessageDlg('OK.', mtInformation,[mbOk], 0);
end;end.
执行ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle)时出错,提示如下:
Access violation at address 002DB137 in module 'ConnectDatabase.dll'.Read of address 00000324.动态库DLL如下:
unit U_DataBaseSetForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, SUIForm, StdCtrls, SUIURLLabel, SUIButton, DB, ADODB,ActiveX;type
TDataBaseSetForm = class(TForm)
suiForm1: TsuiForm;
Panel1: TPanel;
btnSave: TsuiButton;
btnCancle: TsuiButton;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
edtServerName: TEdit;
edtDBName: TEdit;
edtLoginID: TEdit;
edtPassWord: TEdit;
ADOCon: TADOConnection;
procedure btnSaveClick(Sender: TObject);
procedure btnCancleClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataBaseSetForm: TDataBaseSetForm;
ConnString:String;
procedure ShowForm(Ahandle: THandle);stdcall;
function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String; AHandle: THandle):Boolean;stdcall;
implementation{$R *.dfm}procedure ShowForm(AHandle: THandle);
var DataBaseSetForm:TDataBaseSetForm;
begin
Application.Handle := AHandle;
DataBaseSetForm:=TDataBaseSetForm.Create(Application);
DataBaseSetForm.ShowModal;
DataBaseSetForm.Free;
end;function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String ; AHandle: THandle):Boolean;stdcall;
begin
Application.Handle := AHandle;
ConnString := 'Provider=SQLOLEDB.1;Password=' + LoginPass +';Persist Security Info=True;User ID=';
ConnString := ConnString + LoginID +';Initial Catalog=' + DBName + ';Data Source='+ServerName;
with DataBaseSetForm do
begin
DataBaseSetForm.ADOCon.ConnectionString := ConnString;
try
ADOCon.Connected;
Result:=True;
except
Result:=False;
end;
end;
end;procedure TDataBaseSetForm.btnSaveClick(Sender: TObject);
begin
//如果在此事件中参数调用ConnDatabase也会出错,提示同上!
ConnString := 'Provider=SQLOLEDB.1;Password=' + Trim(edtPassWord.Text) +';Persist Security Info=True;User ID=';
ConnString := ConnString + Trim(edtLoginID.Text) +';Initial Catalog=' + Trim(edtDBName.Text) + ';Data Source='+Trim(edtServerName.Text); ADOCon.ConnectionString:= ConnString;
try
ADOCon.Connected;
Application.MessageBox('连接成功!', '系统提示', MB_OK);
except
ADOCon.Free;
Application.MessageBox('数据库连接失败!', '系统提示', MB_OK);
end;
end;procedure TDataBaseSetForm.btnCancleClick(Sender: TObject);
begin
Close;
end;initialization
CoInitialize(nil);
finalization
CoUnInitialize;end.
调用DLL的程序如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SUIButton, ExtCtrls, SUIForm, StdCtrls, Buttons, DB, ADODB,
Grids, DBGrids;type
TForm1 = class(TForm)
suiForm1: TsuiForm;
btnShowForm: TsuiButton;
Connet: TBitBtn;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
procedure btnShowFormClick(Sender: TObject);
procedure ConnetClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String;AHandle:THandle):Boolean;stdcall; external'ConnectDatabase.dll';
procedure ShowForm(AHandle: THandle);stdcall;external'ConnectDatabase.dll';
implementation{$R *.dfm}procedure TForm1.btnShowFormClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
ShowForm(AHandle);
end;procedure TForm1.ConnetClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
if ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle) then
MessageDlg('OK.', mtInformation,[mbOk], 0);
end;end.
执行ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle)时出错,提示如下:
Access violation at address 002DB137 in module 'ConnectDatabase.dll'.Read of address 00000324.动态库DLL如下:
unit U_DataBaseSetForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, SUIForm, StdCtrls, SUIURLLabel, SUIButton, DB, ADODB,ActiveX;type
TDataBaseSetForm = class(TForm)
suiForm1: TsuiForm;
Panel1: TPanel;
btnSave: TsuiButton;
btnCancle: TsuiButton;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
edtServerName: TEdit;
edtDBName: TEdit;
edtLoginID: TEdit;
edtPassWord: TEdit;
ADOCon: TADOConnection;
procedure btnSaveClick(Sender: TObject);
procedure btnCancleClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataBaseSetForm: TDataBaseSetForm;
ConnString:String;
procedure ShowForm(Ahandle: THandle);stdcall;
function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String; AHandle: THandle):Boolean;stdcall;
implementation{$R *.dfm}procedure ShowForm(AHandle: THandle);
var DataBaseSetForm:TDataBaseSetForm;
begin
Application.Handle := AHandle;
DataBaseSetForm:=TDataBaseSetForm.Create(Application);
DataBaseSetForm.ShowModal;
DataBaseSetForm.Free;
end;function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String ; AHandle: THandle):Boolean;stdcall;
begin
Application.Handle := AHandle;
ConnString := 'Provider=SQLOLEDB.1;Password=' + LoginPass +';Persist Security Info=True;User ID=';
ConnString := ConnString + LoginID +';Initial Catalog=' + DBName + ';Data Source='+ServerName;
with DataBaseSetForm do
begin
DataBaseSetForm.ADOCon.ConnectionString := ConnString;
try
ADOCon.Connected;
Result:=True;
except
Result:=False;
end;
end;
end;procedure TDataBaseSetForm.btnSaveClick(Sender: TObject);
begin
//如果在此事件中参数调用ConnDatabase也会出错,提示同上!
ConnString := 'Provider=SQLOLEDB.1;Password=' + Trim(edtPassWord.Text) +';Persist Security Info=True;User ID=';
ConnString := ConnString + Trim(edtLoginID.Text) +';Initial Catalog=' + Trim(edtDBName.Text) + ';Data Source='+Trim(edtServerName.Text); ADOCon.ConnectionString:= ConnString;
try
ADOCon.Connected;
Application.MessageBox('连接成功!', '系统提示', MB_OK);
except
ADOCon.Free;
Application.MessageBox('数据库连接失败!', '系统提示', MB_OK);
end;
end;procedure TDataBaseSetForm.btnCancleClick(Sender: TObject);
begin
Close;
end;initialization
CoInitialize(nil);
finalization
CoUnInitialize;end.
解决方案 »
- 请教一个DELPHI问题:delphi7能否连接其他电脑上的ACCESS数据库?
- 能用变量向组件的commandtext属性中传递参数?
- 请问TRxRichEdit是一个控件吗?
- 请问用IdMessage1发邮件,如何解决安全验证问题?在smtp.163.com 发不成功,在sohu上没有问题。
- 请问怎样从压缩文件(zip或rar)中取数据?
- 要换手机号了,有哪些网站有手机支付呀,我想把卡里的钱用光
- 词法分析器
- 取数据,急!!!在线等
- BDE的使用和MS SQLSERVER2000的安装
- 如何用DELPHY编一个小程序,实现对另外的几个可执行程序的调用?
- ****失恋了,心情不好,大家有好的聊天室吗?****
- delphi与Oracle连接问题,急!
帮你顶
没有用过dll里面用窗体
执行ConnetClick调用ConnDatabase时出错!
procedure TForm1.btnShowFormClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
ShowForm(AHandle);
end;procedure TForm1.ConnetClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
if ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle) then
MessageDlg('OK.', mtInformation,[mbOk], 0);
end;
to:wanwangzhiwang(万王之王) ( )
我在dll的项目文件中已经引用ShareMem!但还是不行!
你说得不错!我将ConnDatabase作了如下修改就可以了!
function ConnDatabase(ServerName,DBName,LoginID,LoginPass:String ; AHandle: THandle):Boolean;stdcall;
var
DataBaseSetForm :TDataBaseSetForm ;
begin
Application.Handle := AHandle;
ConnString := 'Provider=SQLOLEDB.1;Password=' + LoginPass +';Persist Security Info=True;User ID=';
ConnString := ConnString + LoginID +';Initial Catalog=' + DBName + ';Data Source='+ServerName;
DataBaseSetForm :=TDataBaseSetForm .Create(Application);
with DataBaseSetForm do
begin
m_Connect:=False;
ADOCon.ConnectionString := ConnString;
try
ADOCon.Connected:=True;
m_Connect:=True;
except
m_Connect:=False;
end;
Result:=m_Connect;
end;
DataBaseSetForm .Free;
end;但我增加了如下的函数:
function FindAllRecord:_RecordSet;stdcall;
begin
DataBaseSetForm :=DataBaseSetForm .Create(Application);
DataBaseSetForm .ADOQ1.ConnectionString:=ConnString;
DataBaseSetForm .ADOQ1.Close;
DataBaseSetForm .ADOQ1.SQL.Clear;
DataBaseSetForm .ADOQ1.SQL.Add('Select * from u_user');
DataBaseSetForm .ADOQ1.Open;
m_Record:=DataBaseSetForm .ADOQ1.Recordset;
result:=m_Record As _Recordset;
DataBaseSetForm .Free;
end;在另一工程中进行如下调用:
procedure TForm1.btnFindAllClick(Sender: TObject);
var
AHandle: THandle;
begin
AHandle := Application.Handle;
if ConnDatabase('SB11','SB11','SB11ID','SB11IDPassWord',AHandle) then
ADOQ_1.Recordset:=FindAllRecord(AHandle)
else
MessageDlg('数据库连接失败!', mtInformation,[mbOk], 0);
end;
调用成功,但关闭此应用程序时出错!提示如下:
"0x002336d6"指令引用的"0x00d32468"内存.该内存不能为"read".
按下"确定"后出现下边的错误提示:
Runtime error 216 at 002336D6
TShowForm = procedure(AHandle: THandle);
var
LibHandle: integer;
ShowForm:TShowForm;
begin
LibHandle := loadLibrary(PChar('ConnectDatabase.dll'));
try
if LibHandle <> 0 then
begin
@ShowForm := GetProcAddress(LibHandle,'ShowForm'); if @ShowForm <> nil then
begin
//调用动态链接库中主窗体的ShowModal方法
ShowForm(application.handle);
end;
end
else begin
MessageDlg('没有发现插件:',mtwarning,[mbok],0);
exit;
end;
finally
FreeLibrary(LibHandle);
end;