Свойство Cominitialization ServerController
Вопрос
Я новичок в Intraweb. Я хочу сделать простое приложение, которое подключает и отображает базу данных Access с использованием элементов управления ADO. Когда я выполняю сервер, он дает мне
"Coinitialize не была названа"
ошибка. Я искал интернет и нашел много текстов, сообщающих, что
Изменить свойство Cominitialization iwservercontroller на cimultithreaded.
Я попытался сделать это в мероприятии iwappformcreate. Затем я получил ошибку компиляции:
"Необладающий идентификатор cimultithreaded"
Я положил линию IWServerController.ComInitialization:=ciMultiThreaded;
Затем возникает ошибка во время выполнения:
"Нарушение доступа по адресу ..."
Так как я не знаю, что я делаю, я не могу найти проблему. Помогите мне, пожалуйста.
Решение
А Ошибка COINITIALIGE на IntraweB с использованием ADO дает вам правильный ответ.
Как я поймаю от комментариев @David Ответ На этот вопрос остались две вещи:
- Где объявлен тип Tominitialization, который, в свою очередь, определяет идентификатор Cimultithreaded. Ответ на это: iwservercontrollerbase Блок, часть Intraweb.
- Где изменить свойство 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;
Нажимая кнопку, создает это:
Надеюсь, это достаточно для вас.
Другие советы
Похоже, вы не инициализировали 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
Надеюсь, это поможет некоторым.