Как решить проблему "загружены два разных CRTLDLL" при использовании пакетов в C++ Builder 2010?

Мы пытаемся разделить наш монолитный EXE -файл на комбинацию EXE -файла и нескольких пакетов. Пока у нас есть один пакет, который мы пытаемся использовать, и при запуске EXE Codeguard выдает следующую ошибку при запуске:

 Ошибка CG

Загружены два разных CRTLDLL. CG может сообщать о ложных ошибках
(C:\Windows\system32\CC32100MT.DLL)
(D:\Projects\Foo\Bar.bpl)

Хорошо 

Я прочитал это как две разные загружаемые библиотеки времени выполнения - одну, правильную (CC32100MT.dll), одну неправильную, то есть пакет, который мы пытаемся использовать.

Продолжение запуска программы показывает странные ошибки, особенно приведение между классами или передача указателя на класс в качестве параметра в методе, который пересекает границу EXE/DLL. Сам по себе Codeguard не показывает никаких других ошибок. Изменить: теперь это решено, и не связано. Кажется, что программа работает правильно, но предупреждение Codeguard все еще вызывает беспокойство.

Как мы решаем это?

Еще немного деталей

Мы рассмотрели столько вещей, сколько мы (разработчик, работающий над этим, и я) можем совместно придумать:

  • Каждый проект построен с использованием пакетов времени выполнения. Хост EXE содержит список Bar в своем списке пакетов.

  • Каждый проект настроен на компиляцию с динамическим RTL. Однако изменение этого не решает проблему.

  • Пакет связан с EXE -файлом через его BPI-файл, но связь через LIB также не имеет значения.

  • EXE и BPL компилируются с одинаковыми настройками проекта, где для обоих типов проектов существуют одинаковые параметры. Мы так или иначе думаем:)

  • В системе есть только одна копия BPL и BPI: она определенно связана с нужной.

  • Изучение EXE и BPL с Depends а также TDump показать, что они оба используют C:\Windows\system32\CC32100MT.DLL, Они оба должны использовать один RTL.

  • Создание нового проекта (простое приложение VCL форм) и связывание с BPL (через его BPI) работает нормально. Что-то в процессе добавления всех файлов и LIB, которые делают наш EXE -файл, содержит код, необходимый для его изменения, но мы не смогли выяснить, что именно.

    • Все библиотеки LIB либо соответствуют используемым нами библиотекам DLL (плоский интерфейс C, как правило, выглядят так, как будто они были построены с помощью MSVC), либо представляют собой простые проекты с большим количеством связанных файлов, скомпилированных в lib для ссылки на EXE - они примерно соответствуют кстати, к разделам программы, которые мы хотим разделить на BPL. Похоже, что нет вариантов проекта для проектов LIB, которые могли бы повлиять на RTL-соединение, если только мы не пропустили их.

    • Я исчерпывающе охотился через Depends и посмотрел на все файлы RTL и CC32*.dll EXE и все ссылки на DLL. Все идентичны: rtl140.bpl и CC32100MT.DLL. Полные пути показывают, что они тоже являются одинаковыми файлами. Все должно быть с использованием одной и той же библиотеки времени выполнения.

Редактирование: финальный EXE является сложным, состоит из нескольких библиотек, нескольких библиотек DLL и т. Д. Все они, при сборке с C++Builder, создаются с текущей версией. Возможно ли, что в одной из этих библиотек или библиотек есть что-то, что может вызвать проблемы? Я не знаю достаточно о том, как RTL связан, чтобы быть уверенным в том, где искать... мое (наивное?) Предположение, что компоновщик обычно связывает в одном наборе функций RTL, но это, конечно, не кажется, что происходит... и я не знаю, как все меняется при использовании пакетов. Возможно ли, что эта ошибка существовала всегда, и Codeguard не помечал ее раньше, потому что мы не использовали что-то динамическое, например, пакет?

Возможно, другой вопрос: почему пакет в любом случае имеет свой собственный RTL или что делает Codeguard "библиотекой RTL"?

Мы в тупике. Абсолютно в тупик. У нас были другие проблемы с использованием BPL (они кажутся удивительно сложными, особенно с использованием C++), но нам удалось решить их все. На этот раз нам не повезло, и мы были бы очень благодарны за любые идеи:)

Мы используем C++Builder 2010 (фактически, как часть RAD Studio, но с небольшим кодом Delphi, кроме компонентов).

Изменить: Началось вознаграждение. Я бы очень хотел решить это!

Редактировать 2: Спасибо David Dean за помощь (помечен как ответ ниже). По электронной почте он указал, что этот вопрос был воспроизведен кем-то еще в простом тестовом примере, и зарегистрирован в Embarcadero QC как отчет 86335. В настоящее время исправления не существует, но предупреждение не указывает на подлинную проблему (т. Е. Это, вероятно, ложная ошибка, и, хотя при запуске очень жаль, что нужно щелкнуть мимо диалогового окна, надеюсь, в ошибке нет ничего, что могло бы беспокоиться) около.)

4 ответа

Решение

Поскольку один из них исходит из.bpl, вы пытались отключить "Сборка с помощью пакетов времени выполнения" в опциях проекта?

У нас была похожая проблема. Мы отследили его до (не VCL) .cbproj, который был создан без опции "Многопоточный".

Насколько я могу судить, единственный раз, когда вы получаете возможность установить эту опцию, это когда вы создаете новый.cbproj, он не может быть изменен впоследствии с помощью графического интерфейса. В итоге мы взломали.cbproj, включив в него следующее:

<Multithreaded>true</Multithreaded>

Чтобы определить, какая dll вызывает проблему, она должна быть последней dll, загруженной в окно вывода непосредственно перед тем, как вы увидите сообщение CG.

Клиент зарегистрировал аналогичный случай в нашей общедоступной системе отслеживания ошибок, и ошибка была идентифицирована и исправлена ​​в последней версии.

Вы проверяли, используете ли вы _TCHAR как символ? У нас были некоторые похожие проблемы с RAD Studio, и мы нашли обходной путь, используя _TCHAR в качестве char. Как только один проект DLL или BPL скомпилирован с помощью wchar_t, появляется эта ошибка защиты кода.

Мы также выяснили, что проекты EXE могут быть скомпилированы с TCHAR = wchar_t без каких-либо проблем (основной функцией будет WIDE).

Настройки не влияют на способность графического интерфейса пользователя обрабатывать UNICODE.

Другие вопросы по тегам