熟悉指针的朋友请进, 急!!!(200分)

  • 主题发起人 主题发起人 zhang12345
  • 开始时间 开始时间
Z

zhang12345

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TOnError = procedure(aErrorID: integer; aErrorMsg: shortstring) of object; stdcall;
procedure Test.TestOnError(aErrorID: integer; aErrorMsg: shortstring); stdcall;
begin
Showmessage(aErrorMsg);
end;

procedure Test.aa;
var
TmpOnError: TOnError;
TmpOnError1: TOnError;
pp: pointer;
pOnError: ^TOnError;
begin
TmpOnError := TestOnError;
TmpOnError(1, '2'); //执行正常
pOnError := @TmpOnError;
TmpOnError1 := pOnError^;
TmpOnError1(11, '2'); //出现access violation 错误
end;
以上程序是把我的程序简化后的,请说明出错原因及解决办法,谢谢!
 
begin
TmpOnError := TestOnError;
TmpOnError(1, '2');
[blue]new(pOnError);//指针变量需先申请空间[/blue]
pOnError := @TmpOnError;
TmpOnError1 := pOnError^;
TmpOnError1(11, '2'); //出现access violation 错误
end;
 
TmpOnError := TestOnError;
TmpOnError(1, '2'); //执行正常

pOnError := @TmpOnError;
//TmpOnError1 := pOnError^; //TmpOnError1的地址根本不是pOnError,改成如下才行
@TmpOnError1 := pOnError;

TmpOnError1(11, '2'); //这就行了。呵呵/
 
那可以指针好像不可以定义的。
其它的用法都正确。
如果是要动态装入dll,调用其中的function or procedure.
你的单元中的函数说明
TOnError = procedure(aErrorID: integer; aErrorMsg: shortstring); stdcall;
这里不可以加of object.
aProc: tonerror;
@aProc:=GetProcAddress(..);
@aProc(...)
这样是可以的,如果加上of object,好像就不行了
 
谢谢大家!
winlmp:
按你的方法改过后还是提示错误
kkyy:
编译时提示Not enough actual parameters
twos:
TOnError时我声明的事件的类型,不是要从DLL中引出的函数
 
var
TmpOnError: TOnError;
TmpOnError1: TOnError;
pOnError: ^TOnError;
begin
New(pOnerror);
TmpOnError := TestOnError;
TmpOnError(1, '2');
pOnError^ := TmpOnError;
TmpOnError1 := pOnError^;
TmpOnError1(11, '3');
Dispose(pOnError);
end;
 
接受答案了.
请大家继续关注:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1211018
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
641
import
I
I
回复
0
查看
628
import
I
后退
顶部