关于网友提出的“ 动态调用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);
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:
我刚测试了下,没有问题.
写法上唯一不规范的地方是如下,但是虽然不规范,依旧不会有错误
解决方案4:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0, b, t, 0);
end;
干吗不用Delphi封装好的
参数类型换成PAnsiChar试试
inst := LoadLibrary('user32.dll');
if inst <> 0 then
inst 断点跟下,看是否取到值了,
你用map文件查看一下,map文件可以定位到错误行
解决方案7:应该没问题的,