3

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

对于与 Oracle 的连接,我尝试使用 DOA(直接 Oracle 访问)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(股票和更新 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”接口是由Delphi 2009 WSDL Importer 自动生成的。这是有意义的部分:

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 中运行应用程序,按下按钮(关闭 ShowMessages 后面的 2 个),然后关闭表单。

4

1 回答 1

2

鉴于这可能是一个“DLL 地狱”问题的提示,我能够在 Windows XP 和 Vista 上运行测试:一切正常。所以我开始认为这个问题一定与 Windows 7 上的 Delphi 2009 有关。

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

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

ID:27476,用于 Delphi 2009 和 C++Builder 2009 的修补程序 2

应用补丁解决了!

于 2012-10-30T07:18:04.667 回答