在 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 中应用程序关闭时的堆损坏有关的问题......
请问有什么帮助吗?
重现步骤(来自评论):
- 创建一个新的 VCL 表单应用程序
- 在窗体上放置一个 TOracleSession DOA 组件(名为 OracleSession1)
- 在窗体上放置一个 TButton(名为 Button1)
- 为按钮单击事件放置此事件处理程序:
这是代码:
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 个),然后关闭表单。