Свойство ComInitialization для ServerController - PullRequest
2 голосов
/ 19 марта 2011

Я новичок в IntraWeb. Я хочу сделать простое приложение, которое соединяет и отображает базу данных доступа, используя элементы управления ADO. Когда я запускаю сервер, он дает мне

"CoInitialize не был вызван"

ошибка. Я искал в Интернете и нашел много текстов, говорящих, что

Изменить свойство ComInitialization для IWServerController to ciMultiThreaded.

Я пытался сделать это в событии IWAppFormCreate. Тогда я получил ошибку компиляции:

«Необъявленный идентификатор ciMultiThreaded»

Я поставил строку IWServerController.ComInitialization:=ciMultiThreaded;, тогда появляется ошибка времени выполнения:

"Нарушение доступа по адресу ..."

Так как я не знаю, что я делаю, я не могу найти проблему. Пожалуйста, помогите мне.

Ответы [ 3 ]

3 голосов
/ 19 марта 2011

Ошибка CoInitialize на IntraWeb с использованием ADO дает правильный ответ.

Как я понял из комментариев к @ David David на этот вопрос, существует дваосталось:

  1. Где объявлен тип TComInitialization, который, в свою очередь, определяет идентификатор ciMultiThreaded.Ответ заключается в следующем: модуль IWServerControllerBase, часть Intraweb.
  2. Где изменить свойство ComInitialization объекта IWServerController, чтобы это работало.
    • Первое, что вам нужно знать, - это фактический класс, используемый для создания объекта IWServerController, который является частью вашего проекта IntraWeb.
    • Далее, при попытке установить это свойство на странице событие OnCreate выглядит слишком поздно (оно должно быть создано в потоке, который вы хотите инициализировать COM), я предполагаю, что изменение этого свойства в данный момент запрещено и будетвызовите исключение или будет полностью проигнорировано.
    • Использование Delphi XE VCL для мастера веб-приложений Я получил модуль с именем 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 Succesfully connected

Надеюсь, этотебе достаточно.

0 голосов
/ 09 августа 2012

Если бы вы использовали Мастер приложений IntraWeb в XE2, он бы создал для вас модуль ServerController.pas.

Если вы откроете этот модуль в визуальном конструкторе и нажмете «форму», вы увидите множество свойств для TIWServerController. Одним из них является ComInitialization, который представляет собой раскрывающийся список, содержащий ciMultiThreaded, ciNone, ciNormal. По умолчанию это ciNone.

Вот DFM после того, как я изменил свойство ComInitialization:

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

Надеюсь, это поможет некоторым.

0 голосов
/ 19 марта 2011

Похоже, вы не инициализировали COM, что вы должны сделать, позвонив по номеру CoInitializeEx(). Из документации:

CoInitializeEx должен быть вызван как минимум один раз, и обычно вызывается только один раз, для каждого потока, который использует COM библиотека. Несколько звонков на CoInitializeEx по той же теме разрешено, если они проходят одно и то же флаг параллелизма, но последующий действует звонки возвращают S_FALSE. Закрыть COM библиотека изящно по потоку, каждый успешный вызов CoInitialize или CoInitializeEx, включая любой звонок который возвращает S_FALSE, должен быть сбалансирован соответствующим звонком CoUninitialize.

...