关于网友提出的“ DLL调用成功但最后总出现错误提示,请高手指教”问题疑问,本网通过在网上对“ DLL调用成功但最后总出现错误提示,请高手指教”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: DLL调用成功但最后总出现错误提示,请高手指教
描述: 说明:动态连接库内一个函数完成对SQLSERVER中一个数据库的表进行记录的插入
错误描述:调用成功,记录插入也成功,但在回收内存时总出现错误提示:Invalid Pointer Operation
DLL的写法如下:
library GPRSRecord;
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
DBMOD in 'DBMOD.pas' {DBHouse: TDataModule};
{$R *.RES}
function PackWriteToDB(APack:String):String;stdcall;
begin
Result := 'OK';
try
DBHouse.Database1.Execute(Format('Insert Into GprsPack (AData) Values (''%S'')', [APack]));//插入数据库记录
except
on E:Exception do
Result := E.Message;
end;
end;
exports
PackWriteToDB;
begin
Application.Initialize;
Application.CreateForm(TDBHouse, DBHouse);
Application.Run;
end.
以下是数据模块DBMOD的内容
unit DBMOD;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, IniFiles;
type
TDBHouse = class(TDataModule)
Database1: TDatabase;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DBHouse: TDBHouse;
implementation
{$R *.DFM}
procedure TDBHouse.DataModuleCreate(Sender: TObject);
var
MyIniFile: TIniFile;
WinSysPath: PChar;
begin
GetMem(WinSysPath,255);
GetSystemDirectory(WinSysPath,255); //获取系统路径
MyIniFile := TIniFile.Create(WinSysPath + '\HBSYS.ini');
MyIniFile.Free;
Database1.Params.LoadFromFile(WinSysPath + '\DBParams.lp');//取出配置文件中的数据库配置信息
DBHouse.Database1.Connected := True;//连接数据库
end;
procedure TDBHouse.DataModuleDestroy(Sender: TObject);
begin
DBHouse.Database1.Connected := False;//断开数据库
end;
end.
程序调用如下:
unit Test;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
tsfm=function (APack: String):String;stdcall;
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
function PackWriteToDB(APack :String):String;stdcall;external'GPRSRecord.dll';
procedure TForm2.Button1Click(Sender: TObject);//动态调用
var
hinst:thandle;
fpointer:tfarproc;
myfunct:tsfm;
begin
hinst:=loadlibrary('GPRSRecord');
if hinst>0 then
try
fpointer:=getprocaddress(hinst,pchar('PackWriteToDB'));
if fpointer<>nil then
begin
myfunct:=tsfm(fpointer);
Edit2.Text := myfunct(Edit1.Text);//调用成功将“OK”写入
//Edit2.Text中,失败则将错误信
//息写入Edit2.Text
end
else
showmessage('Error: Function not Found');
finally
freelibrary(hinst); //程序运行到此处时出现错误提示
end
else
showmessage('Error: dll not found');
end;
procedure TForm2.Button2Click(Sender: TObject);
begin //静态调用
Edit2.Text := PackWriteToDB(Edit1.Text); //调用成功将“OK”写入
//Edit2.Text中,失败则将错误信
//息写入Edit2.Text
end;
end.
以上介绍了“ DLL调用成功但最后总出现错误提示,请高手指教”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3464933.html