您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> DLL调用成功但最后总出现错误提示,请高手指教

DLL调用成功但最后总出现错误提示,请高手指教

来源:网络整理     时间:2016/8/21 22:33:26     关键词:

关于网友提出的“ 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

相关图片

相关文章