大虾帮解释一下DLLProc:=@DLLEntryPoint,加不加@的区别?(30分)

  • 主题发起人 主题发起人 fonawu
  • 开始时间 开始时间
F

fonawu

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi开发人员指南上说的是 DLLProc是一个过程指针。既然他是过程指针,为何不直接:DLLProc:=DLLEntryPoint(我试了下,编译可以通过)?而要在前面加个@?

我完全糊涂了,本来过程名就是一个指针,所以直接把过程名赋值给过程指针是说的过去的,而DLLProc:=@DLLEntryPoint的话,DLLProc反而成了指针的指针,望高手解惑:

加不加@的区别?
 
加不加@是有区别的
P: Pointer;
p := @DLLEntryPoint;
ShowMessage(IntToStr(Integer(p)));
ShowMessage(IntToStr(Integer(p^)));
在c里面好象是一样的
 
因為過程名在編譯的時候,D 們不是把整個函數體都編譯進內存地址的,只會在內存中開闢一個過程名的指針空間。當程序運行到要調用該過程時,D 再從類空間中找到相應的函數體,創建內存空間,在把這個過程名指向這個內存空間,就完成了過程的調用。

這大概就能解析為什麽要加@ 的理由了。
 
DLLEntryPoint是过程,
@DLLEntryPoint是过程入口地址,
DLLProc是指针,
DLLProc:=@DLLEntryPoint将DLLEntryPoint过程入口地址赋值给DLLProc指针,
没啥问题。
 
请各位大侠进去帮忙查看一下,如何处理?多谢
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3935873
 
对于函数或方法,或函数或方法类型变量,加一个@跟不加,都可以表示入口地址,也就是通常说的函数指针或方法指针。有时候加@是为了避免编译器把函数或方法名当做函数调用。
 
看来 地质灾害 的回答 我明白了
 
接受答案了.
 
后退
顶部