我在动态调用Dll时候,如下例:
type
TaClass= procedure;stdcall;
var
hnd:Thandle;
aClass:TaClass;
begin
hnd := LoadLibrary('PrjDll.dll') ;
aClass := GetProcAddress(hnd,'ShowDll');//疑问在此
aClass;
FreeLibrary(hnd);
end;我用@aClass := GetProcAddress(hnd,'ShowDll')一样可以调用成功,
aClass是一个指针,而@aClass是取这个指针的地址,为什么
aClass := GetProcAddress(hnd,'ShowDll')
和
@aClass := GetProcAddress(hnd,'ShowDll')
都可以呢?
type
TaClass= procedure;stdcall;
var
hnd:Thandle;
aClass:TaClass;
begin
hnd := LoadLibrary('PrjDll.dll') ;
aClass := GetProcAddress(hnd,'ShowDll');//疑问在此
aClass;
FreeLibrary(hnd);
end;我用@aClass := GetProcAddress(hnd,'ShowDll')一样可以调用成功,
aClass是一个指针,而@aClass是取这个指针的地址,为什么
aClass := GetProcAddress(hnd,'ShowDll')
和
@aClass := GetProcAddress(hnd,'ShowDll')
都可以呢?
这样一来在给函数或过程类型赋值的时候便可能会造成混乱,如:
type
TFunc = function: Pointer;
var
a, b: TFunc;
begin
a := b; // 编译器不知到底该编译成 a := b() 还是 a := Addr(b)所以delphi规定,
对这种类型的变量赋值加上@操作符限定,
即
@a := @b; // 这样便不会再引发岐义
如果直接取a本身的地址需要用两个@,即 @@a
而@@a才是指针a的地址吗?》