TEMbeddedWB и консоль

Когда я попытался скомпилировать EmbeddedWB в консоли, он жалуется на какой-то модуль OleCtrls. Тем не менее, обычный веб-браузер компилируется без проблем.

Как его скомпилировать под консолью?

[dcc64 Fatal Error] SHDocVw_EWB.pas(66): F1026 File not found: OleCtrls.dcu'


person Community    schedule 23.08.2013    source источник
comment
Определить complain? Какая ошибка?   -  person Lloyd    schedule 23.08.2013


Ответы (1)


Проблема заключается в именах областей действия. Консольное приложение по умолчанию имеет псевдонимы пространств имен модулей, отличные от приложений форм. Решите проблему одним из следующих способов:

  1. Использование полных имен единиц измерения. Полное имя этого модуля — Vcl.OleCtrls.
  2. Добавьте отсутствующие имена областей единиц (в вашем случае Vcl) в конфигурацию проекта консольного приложения.

Поскольку вы компилируете сторонний код, для вас будет предпочтительнее не изменять этот сторонний код. Следовательно, вариант 2 — путь вперед.

Могут потребоваться другие имена областей единиц измерения. Убедитесь, что вы добавили их все. И убедитесь, что вы используете последний исходный код компонента, полученный из репозитория VCS, и дважды проверьте, действительно ли он поддерживает XE4.

Обратите внимание, что я предполагаю, что под консолью вы подразумеваете консольное приложение. Если вы на самом деле имеете в виду компиляцию из командной строки, то ответ по сути тот же. Вам нужно будет убедиться, что имена областей единиц указаны при компиляции. Обычно это делается в конфигурации проекта, а msbuild подхватывает их и передает на dcc32 или dcc64.

person David Heffernan    schedule 23.08.2013
comment
В основном из-за этого Windows.SetParent(WindowHandle, Forms.Application.Handle); - person ; 23.08.2013
comment
Прочитайте мой ответ еще раз. Осторожно. Обратите внимание, что я предлагаю два варианта. Вариант 2 будет означать, что код будет скомпилирован. - person David Heffernan; 23.08.2013
comment
Другая проблема заключается в том, что для того, чтобы заставить код работать (в отличие от компиляции в соответствии с этим вопросом), вам понадобится насос сообщений и скрытое родительское окно, я думаю. Но этот вопрос касается компиляции. Пожалуйста, не позволяйте этому превращаться в отладку нижестоящего уровня. - person David Heffernan; 23.08.2013
comment
Так что добавьте имена областей действия в конфигурацию, как я сказал. Убедитесь, что вы добавили их в базовую конфигурацию. - person David Heffernan; 23.08.2013
comment
Я обновил исходный код для XE4. Могу выложить куда-нибудь для людей с такой же проблемой. :) - person ; 23.08.2013
comment
Какие тогда были проблемы? - person David Heffernan; 23.08.2013
comment
Теперь он работает в 32-битной консоли. Но 64 бит выдает FLOAT DIVIDE BY ZERO ошибки. :) Проблема заключалась в пространствах имен. Например, JPEG, формы и т. д. - person ; 23.08.2013
comment
Вам действительно не нужно менять исходный код. Вы выбрали вариант 1. Вариант 2 лучше. И вы уверены, что у вас есть последняя версия из репозитория vcs? Я ожидаю, что последняя версия будет обрабатывать имена областей единиц. - person David Heffernan; 23.08.2013
comment
Ошибки с плавающей запятой легко исправить. Ожидается, что IE будет работать с замаскированными исключениями с плавающей запятой. Но Delphi очищает маски исключений. Просто маскируйте исключения, и все в порядке. Здесь есть бесчисленное множество вопросов по этой теме, на многие из которых я ответил!! - person David Heffernan; 23.08.2013
comment
Я исправил плавающие исключения, подобные этому. SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]); однако время от времени возникают ошибки COM, такие как $C0000005 with message c0000005 ACCESS_VIOLATION - person ; 23.08.2013
comment
Ну, они слишком общие, чтобы отлаживать отсюда без кода. Извини! - person David Heffernan; 23.08.2013
comment
Я создаю TEmbeddedWB вот так Browser:= TEmbeddedWB.CreateParented(HWND(HWND_MESSAGE)); Browser.Visible:=False; Browser.HandleNeeded; - person ; 23.08.2013
comment
Это не может быть отлажено в комментариях. Сделайте SSCCE и опубликуйте новый вопрос. HWND_MESSAGE точно нельзя использовать в качестве родителя. Это должно быть неправильно. И вы вызвали CoInitialize? - person David Heffernan; 23.08.2013
comment
Спасибо! Кажется, CoInitialize был ключом! Что ж, HWND_MESSAGE работает просто отлично.. Если он не сломался, не чините его!! - person ; 23.08.2013
comment
Хорошо. Три проблемы решаются по цене одной! У тебя там хорошая сделка! ;-) - person David Heffernan; 23.08.2013
comment
Немного поздно, но все же. Что вы думаете об этом MessagePump? - person ; 24.08.2013
comment
Он полон проблем. Я не буду пытаться отлаживать его в комментариях. Я уже прошел лишнюю милю здесь, я думаю. Время для новой темы. - person David Heffernan; 24.08.2013