- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个大问题,因为我不明白指针在delphi中是如何工作的
首先,我从 dll 中获取函数声明。
功能:
type
TMICRCallback = function: Integer; stdcall;
然后我在代码中声明一个函数。
function CBMICRRead : Integer;stdcall;
功能非常简单(这是一个例子)
function TCustomizedTenderPlugin.CBMICRRead : Integer; stdcall;
var
SUCCESS:integer;
begin
SUCCESS:=1;
Result:= SUCCESS;
end;
我声明一个这样的变量
Respuesta : TMICRCallback;
当我尝试将此变量分配给我的函数时,问题发生了:(
Respuesta := CBMICRRead;
这是我第一次在delphi中使用指针,所以也许这是一个愚蠢的问题,但请帮助我
最佳答案
TCustomizedTenderPlugin.CBMICRRead
是一个实例方法。这意味着为了调用它,您必须有一个可以调用它的实例。
另一方面,TMICRCallback
是一个函数指针。它与普通函数而不是实例方法兼容。
它们根本不兼容。为了使 TCustomizedTenderPlugin.CBMICRRead
与 TMICCRallback
兼容,您需要将其定义为:
TMICRCallback = function: Integer of object; stdcall;
object的表示该类型与实例方法兼容。
TMICCRallback
类型的变量(如本答案中所定义)同时保存函数指针和实例指针。它有时被称为二指针函数类型。
在继续之前,我建议您仔细阅读 documentation .
<小时/>我注意到您正在对这些函数指针使用 stdcall
调用约定。这通常表明您正在尝试与外部模块进行互操作。这对于实例方法来说并不可靠。我的意思是,您不能用 Delphi 以外的语言实现 of object
实例方法。如果此代码注定要在互操作设置中使用,那么您应该避免使用 of object
。
对于互操作设置,您通常会将实例指针作为单独的参数包含在内。在这种情况下,Delphi 声明将如下所示:
type
TMICRCallback = function(Data: Pointer): Integer; stdcall;
然后您将实现这样的函数
type
TPlugin = class
function CBMICRRead: Integer;
end;
.....
function PluginCBMICRReadCallback(Data: Instance): Integer; stdcall;
begin
Result := TPlugin(Data).CBMICRRead;
end;
function TPlugin.CBMICRRead: Integer;
begin
Result := ....
end;
最后,外部模块中传递回调的函数需要同时传递 PluginCBMICRReadCallback
和 TPlugin
实例的实例指针。也许有点像这样:
procedure RegisterCallback(Callback: TMICRCallback; Data: Pointer); stdcall;
你可以这样称呼:
var
Plugin: TPlugin;
....
Plugin := ...;//get this instance from somewhere
RegisterCallback(PluginCBMICRReadCallback, Plugin);
<小时/>
查看了 related question 处的 C++ 代码看起来 C++ 端的界面是这样的:
int WINAPI BiMICRSetReadBackFunction(int nHandle,
int (CALLBACK *pMicrCB)(void),
LPBYTE pReadBuffSize,
LPBYTE readCharBuff,
LPBYTE pStatus,
LPBYTE pDetail);
此回调甚至不接受数据指针,因此您根本无法使用实例方法。我无法理解如何实现多个实例的回调!不管怎样,你可以在 Delphi 中像这样声明这个函数:
type
TMICRCallback = function: Integer; stdcall;
function BiMICRSetReadBackFunction(
nHandle: Integer;
MicrCB: TMICRCallback;
pReadBuffSize: PByte;
readCharBuff: PByte;
pStatus: PByte;
pDetail: PByte
): Integer; stdcall; external dllname;
要调用它,您需要这个:
function MICRCallback: Integer; stdcall;//not the method of a class
begin
Result := ....
end;
.....
retval := BiMICRSetReadBackFunction(..., MICRCallback, ....);
关于delphi - "Incompatible types: method pointer and regular procedure",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804039/
我正在使用 Swift 开发一个项目,当时我正在使用 Storyboard为 iPad 和 iPhone 创建 UI,因此我同时需要更改 Storyboard的大小(我使用的是大小类)。在我为 iPh
此示例数据由 Web 服务返回 200,6, "California, USA" 我想使用 split(",") 拆分它们并尝试使用简单的代码查看结果。 String loc = "200,6,\"C
我正在尝试创建正则表达式,以便我可以使用 LucidWorks 对我网站上的某些 URL 进行爬网和索引。 示例网址:http://www.example.com/reviews/assassins-
在检查给定语言是否正常时,我有点困惑。 假设我们必须检查是否: L. The language accepting even number of 0's in regular or not? 我们知道
我真的是新手,所以我为这里的笨拙而道歉。 构造识别以下语言的Deterministic Finite Automaton DFA: L= { w : w has at least two a's an
Pumping Lemma被用来证明一种不规则的语言。但是语言如何 证明是正常的?尤其是, Let L be a language. Define half(L) to be { x | for s
我刚刚开始阅读有关泵送引理的内容,并且知道如何进行一些证明,主要是通过反证法。我似乎找不到答案,只是这个特殊问题。我不知道如何开始。我可以假设必须有一个泵浦长度 P 并且对于 L 的所有 w 元素,L
如果语言 L1,...,Ln 是正则的,那么它们的并集也是正则的吗? 我们知道两种正则语言的并集是正则语言。如何证明多个正则语言的并集也是正则的? 最佳答案 您可以使用归纳法。这是一个非常非常生锈的证
如果对于其语言中的任何字符串 w,PDA(Pushdown Automaton)最多转动其堆栈的方向 k 次,则称其为 k 转。众所周知,语言 L 是线性的当且仅当被 1 圈 PDA 接受。现在,常规
如果语言 L1,...,Ln 是正则的,那么它们的并集也是正则的吗? 我们知道两种正则语言的并集是正则语言。如何证明多个正则语言的并集也是正则的? 最佳答案 您可以使用归纳法。这是一个非常非常生锈的证
给 R 常规语言。 下面的语言是否也是正则的: Comp(R) = { u | u is NOT a sub-word of a word in R } 看起来 Comp(R) 中没有单词,因为 R
设 L1 和 L2 是字母表 {a,b} 上的常规语言。我们定义语言 L3 如下: L3 = {pqr | pr ∈ L1, q ∈ L2} L3 是通过将来自L2 的字符串插入来自L1 的字符串而获
我们都知道(a + b)*是仅包含符号的常规语言 a和 b . 但是(a + b)*是一个无限长的字符串,它是有规律的,因为我们可以建立一个有限自动机,所以它应该是有限的。 任何人都可以解释一下吗?
如何计算常规语言的最小抽水长度。例如,如果我有 0001*,那么最小抽气长度应该是 4,即 000 无法抽气。为什么会这样? 最佳答案 它将小于或等于该语言的最小 DFA 中的状态数减去一。因此,将正
我有以下代码可以执行我想要的操作,从该命令的结果中检索包名称: 命令: dpkg --get-selections | grep amule 要分析的字符串: string = 'amule\t\t\
1、什么是正则表达式? 简单的说:正则表达式(Regular Expression)是一种处理字符串匹配的语言; 正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,
前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 1. 引子
给定 L1 上下文无关的非正则语言。 给定 L2 常规语言。 L1 U L2 =常规语言有可能吗? 另外,L1*L2 = 常规语言有可能吗? 我认为第二个是不可能的。但我不确定。 如果上述陈述之一(或
我需要解决抽奖引理问题。 L = { {a,b,c}* | #a(L) N个字母。 pigeon principle告诉我们必须存在一个达到2次的状态,因此在该状态下将存在一个循环。 用您的符号,您
我知道 n > 0 的 anbn 不是抽引引理的规则,但我可以想象 a*b*是常规的,因为 a,b 不必是相同的长度。有没有证据证明它是正常的? 最佳答案 回答你的问题: imagine a*b* t
我是一名优秀的程序员,十分优秀!