The begin ... end
or an initialization
dll 的一部分在 Delphi 中相当于 C++ 中的 dllmain。因此,同样的限制也适用,包括:
- 不要调用 CoInitialize
- 不要调用 COM 函数
这意味着您无法创建 ADO 连接。
你知道当你打电话时发生的所有事情吗TADOConnection.Create(Application);
?
所以你想做的事情是行不通的。即使确实如此,你也不应该这样做。这里有一些更好的解释:
http://msdn.microsoft.com/en-us/library/ms682583%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2014/08/21/10551659.aspx
MSDN 建议在 GetExtensionVersion 中创建数据库连接。这就是 isapi dll 的初始化方式。它不仅仅是用于报告扩展版本。所以这就是要走的路。创建您自己的 GetExtensionVersion 函数来初始化数据库,然后调用前面的 Delphi 函数。
library Project1;
uses
Winapi.ActiveX,
System.Win.ComObj,
Web.WebBroker,
Web.Win.ISAPIApp,
Web.Win.ISAPIThreadPool,
Winapi.Isapi2,
Winapi.Windows,
WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule};
{$R *.res}
function GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL; stdcall;
begin
Result := Web.Win.ISAPIApp.GetExtensionVersion(Ver);
// create your ado connection here
end;
exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;
begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
Application.WebModuleClass := WebModuleClass;
Application.Run;
end.