动态调用api出现异常,帮我改下!

来源:互联网  时间:2016/8/24 16:38:21

关于网友提出的“ 动态调用api出现异常,帮我改下!”问题疑问,本网通过在网上对“ 动态调用api出现异常,帮我改下!”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 动态调用api出现异常,帮我改下!
描述:

程序如下:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMB = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    MB: TMB;
    inst: LongWord;
  public
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  inst := LoadLibrary('user32.dll');
  if inst <> 0 then
    MB := GetProcAddress(inst, 'MessageBoxA');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  t,b: PChar;
begin
  t := '标题';
  b := '内容';
  MB(0, b, t, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeLibrary(inst);  {记得释放}
end;
end.
编译没有错误,也可以生成出exe文件。   我运行生成的exe文件后出现了异常:project project1.exe raised exception class eaccessvioaltion with message 'access violation at address 00000000. read of address 00000000'.process stopped.use step or run to continue.
是什么原因呢?   我的是番茄花园的操作系统。            在源程序里帮我改下,谢谢了!


解决方案1:

var
  t,b: string;
begin
  t := '标题';
  b := '内容';
  MB(0, PChar(b), PChar(t), 0);

解决方案2:


procedure TForm1.FormCreate(Sender: TObject);
begin
  inst := LoadLibrary('user32.dll');
  if inst <> 0 then
  //MB := GetProcAddress(inst, 'MessageBoxA');
  @MB := GetProcAddress(inst, 'MessageBoxA');
end

还有就是  查看你Dll 的参数方式 有可能不是 stdcall 
对照参数类型 解决方案3:

我刚测试了下,没有问题.
写法上唯一不规范的地方是如下,但是虽然不规范,依旧不会有错误


procedure TForm1.Button1Click(Sender: TObject);
var
  t,b: PChar;
begin
  t := '标题';
  b := '内容';
  MB(0, b, t, 0);
end;
解决方案4:

干吗不用Delphi封装好的
参数类型换成PAnsiChar试试

解决方案5:

inst := LoadLibrary('user32.dll');
  if inst <> 0 then
inst 断点跟下,看是否取到值了, 

解决方案6:

你用map文件查看一下,map文件可以定位到错误行

解决方案7:

应该没问题的, 

上一篇请问HOOK[0]STORE和HOOK[0]CHANGE分别是什么意思??
下一篇Delphi 7编译时经常出现错误 ntdldll读内存错误
明星图片
相关文章
《 动态调用api出现异常,帮我改下!》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)