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


“尚未调用CoInitialize”


错误。我在互联网上搜索后发现许多文字


更改的ComInitialization属性
IWServerController为ciMultiThreaded。


我尝试在IWAppFormCreate事件中执行此操作。然后我得到编译错误:


“未声明的标识符ciMultiThreaded”


我在行IWServerController.ComInitialization:=ciMultiThreaded;上输入了运行时错误:


“地址访问冲突 。 。 。”


由于我不知道自己在做什么,所以找不到问题。请帮我。

最佳答案

CoInitialize error on IntraWeb using ADO为您提供正确的答案。

当我从对@David answer的评论中捕获到该问题时,剩下两件事了:


在哪里声明了TComInitialization类型,该类型又定义了ciMultiThreaded标识符。
答案是:IWServerControllerBase单元,是Intraweb的一部分。
在何处更改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;


点击按钮,将产生以下结果:



希望这对您足够。

10-05 22:41