TADOConnection在Delphi ISAPI App(TISAPIApplication)的应用程序初始化部分中无法连接:

应用程序是用Delphi XE SPI构建的,运行Win 7 64 / IIS 7.5和WinServer 2008 RS2-无法在全局ISAPI应用程序上下文中与ADO连接。 (示例代码使用的是MS-SQLServer OLEDB,但是使用Sybase ASE提供程序也会失败。)

调用conn.Open时,以下代码失败-TADOConnection.open永不返回-ISAPI应用程序在正常运行中挂起,未引发任何异常:

library ISAPIBareBones;

uses
  ActiveX,
  ADODB,

    (...)

var
  conn: TADOConnection;

begin

  CoInitFlags := COINIT_MULTITHREADED;
  Application.Initialize;

  coinitialize(nil);
  conn := TADOConnection.Create(Application);
  conn.ConnectionString := 'Provider=SQLOLEDB.1;xxx';

//Fails here:

  try
    conn.Open;
  except on e:exception do
    logException(e)
  end;


  Application.WebModuleClass := WebModuleClass;
  Application.Run;

end.


特定请求处理程序(Delphi webAction)中的相同代码运行良好。

我们怀疑在ISAPI应用程序级别的IIS中执行特权存在问题。但是据我们所知,整个IIS应用程序堆栈(从webServer本身到特定的虚拟目录)以及ISAPI dll本身都在具有相同执行特权的相同凭据下运行。

同时,我的解决方法是从http响应调用(ISAPI线程)中初始化数据库基础结构,然后只需检查它是否在每个后续调用中都已初始化。这行得通,但是给我带来了一些我不想处理的约束。

在处理传入请求之前,如何在TISAPIApplication实例中建立ADO数据库连接。

最佳答案

我认为问题在于您运行的代码在dll的主过程中运行。初始化的这一部分非常严格,例如您可能无法加载任何dll,
允许调用CoInitialize(请参见http://msdn.microsoft.com/en-us/library/ms678543%28v=vs.85%29.aspx)。
您的ActiveX问题会造成一些麻烦,这很可能是您的原因
例外。

10-08 04:46