2

我是 IntraWeb 的新手。我想制作一个简单的应用程序,它使用 ADO 控件连接和显示访问数据库。当我执行服务器时,它给了我

“尚未调用 CoInitialize”

错误。我在互联网上搜索,发现很多文字告诉我

将 IWServerController 的 ComInitialization 属性更改为 ciMultiThreaded。

我试图在 IWAppFormCreate 事件中做到这一点。然后我得到编译错误:

“未声明的标识符 ciMultiThreaded”

我放了一行IWServerController.ComInitialization:=ciMultiThreaded;,然后出现运行时错误:

“地址访问冲突 。 。 。”

因为我不知道我在做什么,所以我找不到问题。请帮我。

4

3 回答 3

3

IntraWeb 上使用 ADO的CoInitialize 错误为您提供了正确答案。

正如我从@David对这个问题的回答的评论中了解到的,还有两件事:

  1. 其中声明了 TComInitialization 类型,该类型又定义了 ciMultiThreaded 标识符。对此的回答是:IWServerControllerBase 单元,Intraweb 的一部分。
  2. 在哪里更改 IWServerController 对象的 ComInitialization 属性以使其正常工作。
    • 您必须知道的第一件事是用于构造 IWServerController 对象的实际类是 IntraWeb 项目的一部分。
    • 接下来,尝试在页面上设置这个属性 OnCreate 事件看起来太晚了(必须在要初始化 COM 的线程中创建),我的猜测是此时更改此属性是被禁止的,并且会引发异常,或者会被完全忽略。
    • 将 Delphi XE VCL 用于 Web 应用程序向导,我得到了一个名为 ServerController 的单元,其类为 TIWServerController。在重写构造函数失败后,我重写了 AfterConstruction 方法来初始化这样的属性,就像这样

例子:

  TIWServerController = class(TIWServerControllerBase)
    procedure IWServerControllerBaseNewSession(ASession: TIWApplication;
      var VMainForm: TIWBaseForm);

  private

  protected
    //constructor Create; override;  //failed!!
  public
    procedure AfterConstruction; override;
  end;

  //..

procedure TIWServerController.AfterConstruction;
begin
  inherited;
  ComInitialization := ciMultiThreaded;  //succeded
end;

然后,我添加了一个按钮、一个标签并正确配置了 ADOConnection(如果重要,则针对 SQL Server)并且:

procedure TIWForm2.IWButton1Click(Sender: TObject);
begin
  try
    ADOConnection1.Connected := True;
    IWLabel1.Caption := 'Connected';
  except
    on E:Exception do
      IWLabel1.Caption := E.ClassName + ' ' + E.Message;
  end;
end;

点击按钮,产生这个:

TADOConnection 连接成功

希望这对你来说已经足够了。

于 2011-03-19T20:10:57.093 回答
0

听起来您还没有初始化 COM,您需要通过调用CoInitializeEx(). 从文档中:

对于使用 COM 库的每个线程,必须至少调用一次 CoInitializeEx,并且通常只调用一次。允许同一线程多次调用 CoInitializeEx,只要它们传递相同的并发标志,但后续有效调用返回 S_FALSE。要在线程上正常关闭 COM 库,对 CoInitialize 或 CoInitializeEx 的每次成功调用,包括任何返回 S_FALSE 的调用,都必须通过对 CoUninitialize 的相应调用来平衡。

于 2011-03-19T18:26:00.750 回答
0

如果您在 XE2 中使用 IntraWeb 应用程序向导,它会为您创建一个 ServerController.pas 单元。

如果您在可视化设计器中打开该单元,然后单击“表单”,您将看到 TIWServerController 的大量属性。其中之一是 ComInitialization,它是一个包含 ciMultiThreaded、ciNone、ciNormal 的下拉列表。它默认为 ciNone。

这是我更改 ComInitialization 属性后的 DFM:

object IWServerController: TIWServerController
  OldCreateOrder = False
  AuthBeforeNewSession = False
  AppName = 'MyApp'
  CharSet = 'UTF-8'
  CacheExpiry = 120
  ComInitialization = ciMultiThreaded
  Compression.Enabled = False
  Compression.Level = 6
  Description = 'My IntraWeb Application'
  DebugHTML = False
  DisplayName = 'IntraWeb Application'
  Log = loNone
  EnableImageToolbar = False
  ExceptionDisplayMode = smAlert
  HistoryEnabled = False
  InternalFilesURL = '/'
  JavascriptDebug = False
  PageTransitions = False
  Port = 8888
  RedirectMsgDelay = 0
  ServerResizeTimeout = 0
  ShowLoadingAnimation = True
  SessionTimeout = 10
  SSLOptions.NonSSLRequest = nsAccept
  SSLOptions.Port = 0
  SSLOptions.SSLVersion = sslv3
  Version = '12.0.8'
  OnNewSession = IWServerControllerBaseNewSession
  Height = 310
  Width = 342
end

希望这会有所帮助。

于 2012-08-09T05:34:50.443 回答