Вопрос

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

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

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

Изменить свойство Cominitialization iwservercontroller на cimultithreaded.

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

"Необладающий идентификатор cimultithreaded"

Я положил линию IWServerController.ComInitialization:=ciMultiThreaded; Затем возникает ошибка во время выполнения:

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

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

Это было полезно?

Решение

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

Как я поймаю от комментариев @David Ответ На этот вопрос остались две вещи:

  1. Где объявлен тип Tominitialization, который, в свою очередь, определяет идентификатор Cimultithreaded. Ответ на это: iwservercontrollerbase Блок, часть Intraweb.
  2. Где изменить свойство Cominitialization объекта iwservercontroller, чтобы заставить это работать.
    • Первое, что вы должны знать, это фактический класс, используемый для построения объекта iwservercontroller, является частью вашего проекта Intraweb.
    • Далее, попытка установить это свойство на странице Oncreate Event выглядит слишком поздно (оно должно быть создано в потоке, который вы хотите инициализировать Com), я предполагаю, что изменение этого свойства в настоящее время запрещено и поднимает исключение или будет полностью игнорировать.
    • Используя Delphi XE VCL для мастера веб -приложений, я получил устройство с именем ServerController, с классом TIWServerController. После того, как я не переопределял конструктор, я переопределяю метод послеустройства, чтобы инициализация такого свойства, как это

Пример:

  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

Надеюсь, это достаточно для вас.

Другие советы

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

Coinitializeex должен быть вызван как минимум один раз, и обычно называется только один раз, для каждого потока, в котором используется библиотека COM. Несколько вызовов Coinitializeex по одному и тому же потоку разрешены, если они проходят один и тот же флаг параллелизма, но последующие действительные вызовы возвращают s_false. Чтобы изящно закрыть библиотеку COM на потоке, каждый успешный призыв к Coinitialize или Coinitializeex, включая любой вызов, который возвращает S_FALSE, должен быть сбалансирован с помощью соответствующего вызова для COMBINITIALIGE.

Если бы вы использовали мастер приложений IntraweB в XE2, он создал бы для вас блок ServerController.PAS.

Если вы откроете этот блок в визуальном дизайнере и нажмете «Форма», вы увидите множество свойств для Tiwservercontroller. Одним из них является коминтификация, которая является раскрывающейся списком, содержащим 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top