gpt4 book ai didi

Delphi - 连接到 Oracle 并调用 Web 服务方法后关闭时 ntdll.dll 中出现异常

转载 作者:行者123 更新时间:2023-12-03 15:57:01 24 4
gpt4 key购买 nike

在 Delphi 2009 中,我发现每当我同时执行与 Oracle 的连接(通过 OCI.dll)和对 Web 服务方法的调用时,我都会在 ntdll.dll 中遇到异常在 IDE 中关闭我的应用程序时。

对于与 Oracle 的连接,我尝试使用 DOA(直接 Oracle Access)4.1.1.0 和 ODAC 组件(最新试用版);

对于 Web 服务方法调用(只是一个简单的“函数 HelloWorld:字符串”),在从 Web 服务导入 WSDL 后,我使用 Delphi 库存功能。

如果我在“直接”模式下使用 ODAC 组件,即不使用 OCI.dll,则关闭时不会发生异常。

如果我仅调用 Web 服务方法(不连接到 Oracle),则关闭时不会发生异常(即使我使用 DOA 或 ODAC 组件)。

如果我仅连接到 Oracle(通过 OCI.dll)(不调用 Web 服务方法),一切都会正常(无论我使用 DOA 还是 ODAC 组件)。

相同的代码在 Delphi 7 和 Delphi XE2 中执行时运行完美:应用程序关闭时没有发生异常。

一些信息:Delphi 2009(原版和 Update 3 版本)操作系统:Windows 7 32位Oracle Instant Client 10.2.0.4 和 Oracle Instant Client 10.2.0.5

我开始怀疑这可能是与应用程序关闭时 Delphi 2009 中的堆损坏相关的问题...

请问有什么帮助吗?

重现步骤(来自评论):

  1. 创建新的 VCL 表单应用程序
  2. 在表单上放置 TOracleSession DOA 组件(名为 OracleSession1)
  3. 在表单上放置一个 TButton(名为 Button1)
  4. 为按钮单击事件放置此事件处理程序:

这是代码:

procedure TForm1.Button1Click(Sender: TObject);
var
MyWebService3Soap: WebService3Soap;
s: string;
begin
OracleSession1.LogonDatabase := 'SomeLogonDB';
OracleSession1.LogonUsername := 'SomeUsername';
OracleSession1.LogonPassword := 'SomePassword';
OracleSession1.Connected := True;
ShowMessage('Connected');

MyWebService3Soap := GetWebService3Soap();
s := MyWebService3Soap.HelloWorld(); // Just returns a string such as "Hello World"
ShowMessage(s);
end;

“WebService3Soap”接口(interface)是由 Delphi 2009 WSDL Importer 自动生成的接口(interface)。这是有意义的部分:

WebService3Soap = interface(IInvokable)
['{F6F12FA6-3881-8BB5-AD71-2408B47692CD}']
function HelloWorld: string; stdcall;
end;

function GetWebService3Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WebService3Soap;

initialization
InvRegistry.RegisterInterface(TypeInfo(WebService3Soap), 'http://mytest.it/Test3', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WebService3Soap), 'http://mytest.it/Test3/HelloWorld');
InvRegistry.RegisterInvokeOptions(TypeInfo(WebService3Soap), ioDocument);
end.

在 IDE 中运行应用程序,按下按钮(关闭以下 2 个 ShowMessages),然后关闭表单。

最佳答案

鉴于这可能是“DLL hell”问题的提示,我能够在 Windows XP 和 Vista 上运行测试:一切顺利。所以我开始认为这个问题在某种程度上与 Windows 7 上的 Delphi 2009 有关。

我是对的,我发现在 Windows 7 上调试 Delphi 2009 时存在问题。

幸运的是,有可用的补丁:

ID: 27476, Hotfix 2 for Delphi 2009 and C++Builder 2009

应用补丁解决了!

关于Delphi - 连接到 Oracle 并调用 Web 服务方法后关闭时 ntdll.dll 中出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13107382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com