- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 XE6 中使用断开连接的 ADO 记录集。这个想法是,您正常打开记录集,然后将记录集的 ActiveConnection 设置为您语言的等效值 null
/Nothing
/nil
:
rs.Set_ActiveConnection(
null);
以下来自 Delphi 5 的示例运行良好:
var rs: _Recordset;
rs := CoRecordset.Create;
rs.CursorLocation := adUseClient; //the default for a Recordset is adUseServer (Connection.Execute's default is adUseClient)
rs.CursorType := adOpenForwardOnly; //the default
rs.Open(CommandText, Conn,
adOpenForwardOnly, //CursorType
adLockReadOnly, //LockType
adCmdText);
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(nil);
问题是我无法使其在 Delphi XE6 中工作。在 Delphi 5 中我会成功调用:
rs.Set_ActiveConnection(nil);
一切都很顺利。它之所以有效,是因为 _Recordset
接口(interface)声明为:
procedure Set_ActiveConnection(const pvar: IDispatch); safecall;
所以通过 nil
是有效的;它起作用了。
在 XE6 中,声明更改为:
procedure Set_ActiveConnection(pvar: OleVariant); safecall;
您无法传递 nil
。那么问题就变成了,OleVariant
是什么?相当于 nil
?
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(nil); //E2010 Incompatible types: 'OleVariant' and 'Pointer'
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(Null);
导致异常:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(EmptyParam);
导致异常:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(Unassigned);
导致异常:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(OleVariant(nil)); //E2089 Invalid typecast
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(OleVariant(Null));
导致异常:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
我很清楚 Codebarcadero 的声明是错误的。它确实应该是 IDispatch
。这意味着我需要欺骗编译器传递位于地址 0x00000000
的 OleVariant (即零)。这样 ADO 将看到值 0x00000000
在堆栈上,知道我的意思是 null
:
rs.Set_ActiveConnection(POleVariant(nil)^); //access violation before call
我确信 Bo..Imp...Co..Embarcadero 有指定的方式来调用它;我就是想不通。
Dephi 5 做了正确的事情;它将 $00 (即 nil
)压入堆栈:
<strong>rs.Set_ActiveConnection(nil);</strong>
push $0 ;push nil
mov eax,[ebp-$08] ;get address of rs
push eax ;push "this"
mov eax,[eax] ;get VMT of IRecordset
call dword ptr [eax+$28] ;call offset $28 of VMT
而 Delphi XE6 正在通过英勇的努力去做一些我不知道的事情:
<strong>rs.Set_ActiveConnection(nil);</strong>
lea eax,[ebp-$000000d8]
call Null
lea edx,[ebp-$000000d8]
lea eax,[ebp-$000000c8]
call @OleVarFromVar
push dword ptr [ebp-$000000bc]
push dword ptr [ebp-$000000c0]
push dword ptr [ebp-$000000c4]
push dword ptr [ebp-$000000c8]
mov eax,[ebp-$04]
push eax
mov eax,[eax]
call dword ptr [eax+$2c]
最佳答案
在 D7 中(手头没有 D5),AdoInt.Pas 包含两种类型的 Set_ActiveConnection,例如
Recordset15 = interface(_ADO)
['{0000050E-0000-0010-8000-00AA006D2EA4}']
procedure Set_ActiveConnection(const pvar: IDispatch); safecall;
procedure _Set_ActiveConnection(pvar: OleVariant); safecall;
在 Delphi XE6 中:
Recordset15 = interface(_ADO)
['{0000050E-0000-0010-8000-00AA006D2EA4}']
//...
procedure _Set_ActiveConnection(const pvar: IDispatch); safecall;
procedure Set_ActiveConnection(pvar: OleVariant); safecall;
所以尝试XE6中的其他版本。就我个人而言,我会尝试
Set_ActiveConnection(IDispatch(Nil))
首先,但您在评论中说 _Set_ActiveConnection 适合您。
对于需要传递 OleVariant 的接口(interface),我首先尝试 Set_ActiveConnection(IDispatch(Nil)) 的原因是:自从接口(interface)被添加到 Delphi 中(在 D3 中?),版本中的 iirc添加基于变体的 OLE 自动化 (D2) 后,编译器知道如何生成代码以在 OleVariant 和 IDispatch 接口(interface)之间进行双向转换。所以“问题”是如何将 IDispatch 接口(interface)作为 OleVariant 参数传递。从我简单的角度来看,这一点很简单,只需编写 IDispatch() ,其中参数应该是 OleVariant,然后让编译器整理要生成的代码。如果我们想要作为 IDisaptch 接口(interface)传递的值实际上是 Nil,我们只需要编写
SomeInterfaceMemberExpectingAnOleVariant(IDispatch(Nil))
关于delphi - 如何在XE6中断开ADO记录集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017376/
我正在构建一个使用 Oracle 数据库 10g 作为数据库后端的 Web 应用程序。我意识到 Express 版本有限制,但我只是想确保连接数不是其中之一。 Oracle 快捷版 (XE) 是否限制
我是一名开始使用 Oracle 数据库的新手,在将 Oracle XE 11g x64 的最新版本安装到 Microsoft Windows 7 x64 Enterprise 时遇到了问题。 安装过程
我有一个 USB 连接到 device发出串行信息。当我运行下面的 Python 脚本(在 Jupyter Notebook 中)时,我从中得到了奇怪的信息。 import serial ser =
我们有一台运行 Delphi XE Professional 的机器,它会在 IDE 中键入时更改某些键的值。它将字母和数字键更改为数字。按下下一个键将按顺序输入下一个数字,直到 9,然后从 0 重新
从昨天开始,我的源代码中的所有蓝点(编译行)都移动了一行。因此,第一个点从“var”而不是“begin”开始,最后一个点是函数最后一个“end”之前的一行。 我删除了除 DPR、PAS、DFM 和 D
我在 RegexBuddy 中构建了一个匹配模式,其行为完全符合我的预期。但我无法将其转移到 Delphi XE,至少在使用最新内置的 TRegEx 或 TPerlRegEx 时是这样。 我的现实世界
TBytes 变量的正确使用模式是什么?根据我的理解,TBytes不是一个类,而是一个“动态字节数组”。我不确定内存在哪里分配,何时释放,以及将其从生产者传递到消费者的最佳方式是什么。我希望我的生产者
我创建了一个自定义 MSBuild .targets我通过 IDE 将其包含在 Delphi XE 项目中,并从项目管理器的上下文菜单中启用它。尽管文件有效,但在我重新保存项目文件后它总是被禁用。 这
有谁知道 http://reportman.sourceforge.net/可用于 Delphi XE 吗? 最佳答案 我已经成功获得Reportmanager 2.9b通过将以下行添加到文件 rpc
Oracle XE Oracle是这样介绍XE的:11g XE(Express Edition)简化版是在Oracle11gR2基础之上一个入门级的小体量数据库,免费用于开发/部署与发布,下载很快
我已经安装了 docker 在 Ubuntu 21.10 并跟随官方 instructions 我拉甲骨文 11g xe 图片:docker pull oracleinanutshell/oracle
一段时间以来,我一直在寻找解决问题的方法,但似乎没有任何效果,这是我重新安装之前的最后一次尝试。 我今天通过其安装向导安装了 Oracle XE 11g 第 2 版,并且一切顺利。我似乎遇到的麻烦是我
我需要模拟汽车在平方区域上移动(比方说)。 任何人都可以轻松想象计算(x/y 坐标、轨迹、速度、加速度、暂停......) 之前的版本(跨千年错误开发...... 21 年前)运行到 Applicat
我已经下载了适用于 Windows 64 位的 Oracle XE 18c,并尝试将其安装在 Windows 10 机器上。我检查了 SHA-256 校验和,它是正确的。 安装开始正常,但是当它复制新
我需要通过客户端操作删除服务器上的物理文件,然后将文件删除事件通知远程数据库-希望这完全在serverSide上发生。 更高版本的Delphi公开了许多以前在WinAPI调用中被锁定的目录服务。目前,
这几年来我一直没有使用Delphi(我使用的最新版本是D2005),现在我需要在DelphiXE中做一些工作。我的问题是,如何在Delphi IDE中禁用声明包装?目前,我使用Modelmaker的代
如何打开应用程序初始化所在的程序单元?我需要进行一些更改。 另外,除了显示的当前单位以外,还可以在程序中搜索所有单位吗? Delphi 5有一个弹出窗口,您可以选择它。 最佳答案 每个项目均由sing
如何配置Datasnap REST服务器(在Windows上作为服务运行)以处理Delphi XE中的https调用?周围有什么好的例子吗? 向上的Delphi XE2似乎具有其他组件-这是否意味着X
我尝试以这种方式列出程序: type TProc = procedure of object; TMyClass=class private fList:Tlist; function getItem
我刚刚发现了 Delphi 的实时绑定(bind)。并创建了我的第一个组件来处理变频器的控制字。该组件本身似乎在表单设计器中测试它效果很好。但是,编译和运行应用程序不起作用。来自 livbinding
我是一名优秀的程序员,十分优秀!