- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当动态加载 DLL 时,其中 DoSomething
是我们可以执行的方法类型变量
DoSomething:= GetProcAddress(MyDLLHandle ,'DoSomething');
或
@DoSomething:= GetProcAddress(MyDLLHandle ,'DoSomething');
这两者在现代版本的 Delphi 中似乎表现相同。我的问题是 - @
运算符是否始终是可选的,如果不是,在 Delphi 的哪个版本中它成为可选的?
文档指出,@
与例程(函数/过程)类型一起使用时,返回类型为 Pointer
的函数的入口点。当直接使用变量时,它自然具有声明时使用的任何特定类型,但也会返回方法的入口点。 GetProcAddress
返回一个 Pointer
,所以我假设在加载 DLL 时包含 @
的习惯来自于这些不匹配的类型还没有出现的时候。分配兼容。是这样吗?
是否有任何合理的理由来支持这两种风格?
最佳答案
我认为自 Delphi 的原始版本以来没有任何改变。
GetProcAddress
的官方 header 翻译具有 FARPROC
返回类型,它是无类型 Pointer
类型的别名。因此,您可以将几乎所有类似指针的内容放在赋值语句的左侧,因为当其中一个操作数是“指针”时,类型检查会暂停。
另一方面,考虑这个程序:
var
Proc: procedure;
Ptr: Pointer;
begin
Ptr := Proc;
end.
编译失败:
E2010 Incompatible types: 'Pointer' and 'procedure, untyped pointer or untyped parameter'
简单的修复方法是使用 @
运算符:
var
Proc: procedure;
Ptr: Pointer;
begin
Ptr := @Proc;
end.
许多 Delphi 示例都使用这种情况:
@Proc := GetProcAddress(...);
而不是
Proc := GetProcAddress(...);
我相当怀疑这里没有什么深奥的东西。这只是关于该主题的第一篇在线文章的作者在没有充分理由的情况下在整个历史中传播的选择的一个例子。这让我想起了可怕的Rosetta code example动态加载测试 HMODULE
是否大于 32,这是每周都会在 Stack Overflow 问题中看到的错误检查!
在这些情况下您是否应该使用@
?在我看来你不应该。这没有多大区别,既然如此,为什么还要费心使用一些不必要的标点符号呢?
据我所知,还有另一种情况需要使用 @
,在这种情况下,您实际上需要 @@
。考虑以下程序:
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Proc: procedure;
Ptr: Pointer;
begin
Ptr := @Proc;
Writeln(Format('%p', [Ptr]));
Ptr := @@Proc;
Writeln(Format('%p', [Ptr]));
Readln;
end.
输出
0000000000423EBC
第一个赋值获取 Proc
变量中保存的值,因为它是默认初始化的全局变量,所以为零。第二个赋值获取 Proc
变量的地址。为此,您需要@@
。需要这么多间接性是很不寻常的,但在编写与动态链接相关的代码时往往会突然出现。
关于delphi - @映射方法入口点时的运算符用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077994/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!