Странные проблемы сборки VB6 (связанные с nlog)

Я думаю, это связано с тем, что я использую nlog C ++ API (и мой вопрос на форуме nlog: здесь); Цель того, что я задаю этот вопрос здесь, - привлечь более широкую аудиторию к моей проблеме и, возможно, также получить некоторые более общие идеи, лежащие в основе отказа VB6 IDE от моего конкретного сценария.

Вкратце, проблема, с которой я столкнулся, заключается в том, что у меня возникают проблемы со сборкой компонентов VB6, которые ссылаются на неуправляемые компоненты C ++, которые имеют вызовы API C \ C ++ nlog (который определен в NLogC.DLL). Проблемы сборки не возникают во время компиляции, они возникают при сборке двоичного файла, что наводит на мысль, что это какая-то проблема типа компоновщика? Не знаю достаточно о том, как создаются двоичные файлы VB6, чтобы сказать. Двоичный файл VB6 создается, но он поврежден и дает сбой вскоре после вызова.

У кого-нибудь был подобный опыт с VB6 (не обязательно иметь отношение к nlog или C ++)?

edit: Спасибо за все ответы на эту довольно неясную проблему. К сожалению, все еще нет прогресса; мои выводы с тех пор, как я опубликовал это:

  1. «Тонкая настройка» параметров компиляции, похоже, не помогает в решении этой проблемы.
  2. Добавление ссылки на компонент C ++ с поддержкой nlog из «пустого» проекта VB6 не приводит к его сбою и не вызывает странных проблем сборки. Значит, это не «родная» проблема VB6, а, возможно, проблема взаимодействия между nlog и различными компонентами и сторонними библиотеками, используемыми другими компонентами, на которые есть ссылки?
  3. Что касается соглашений о вызовах C ++: компонент C ++ с поддержкой nlog, насколько я могу судить, соответствует этим соглашениям и действительно отлично работает, когда на него ссылается VB6, если он не выполняет никаких вызовов API nlog. Не уверен, что сама nlogc.DLL совместима с VB6, но я бы подумал, что это несущественно, поскольку вызовы API выполняются из компонента C ++; VB6 не должен знать или заботиться о том, на что ссылается компонент C ++ (насколько я понимаю ...)

edit2: Я также должен отметить, что сообщение об ошибке, полученное во время сборки: «Ошибки во время загрузки. Пожалуйста, обратитесь к« xxx »для подробностей». Когда я открываю файл журнала, все, что там написано: «Невозможно загрузить элемент управления xxx». Интересно, что все ссылки на этот конкретный элемент управления исчезают из этого конкретного проекта, что приводит к ошибкам компиляции, если я пытаюсь построить снова.


person jpoh    schedule 25.09.2008    source источник
comment
Непонятно, в чем заключается настоящая ошибка.   -  person StayOnTarget    schedule 22.01.2019


Ответы (6)


Обошел проблему, используя COM-интерфейс NLog (NLog.ComInterop.DLL) из моего неуправляемого кода C ++. Это не так просто, как с C \ C ++ API, но, по крайней мере, это не приводит к сбою моих компонентов VB6.

person jpoh    schedule 30.09.2008

Я бы попытался настроить некоторые параметры Компиляция в меню Проект, Свойства, панель Компилировать, чтобы проверить, они дают любые дополнительные подсказки относительно того, что идет не так.

Например, если вы компилируете исполняемый файл в p-код, а не в собственный код, он все равно дает сбой при запуске.

person jussij    schedule 25.09.2008

Какое сообщение об ошибке появляется при запуске скомпилированного двоичного файла?

Я сомневаюсь, что проблема в компиляторе / компоновщике: ссылки на проекты в проекте VB6 не связаны с окончательным исполняемым файлом. Ссылка на проект в VB6 на самом деле является ссылкой на библиотеку типов COM (которая может быть или не быть встроена в .dll или другой двоичный тип файла). Ссылки на проекты в основном служат двум целям:

  1. IDE извлекает информацию о типах из библиотек типов, на которые имеются ссылки, которые затем отображаются в обозревателе объектов (и в раскрывающемся списке Intellisense).

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

Обратите внимание, что скомпилированный двоичный файл не ссылается на какой-либо код в ссылочных библиотеках и даже не содержит имен файлов ссылочных библиотек. Последний исполняемый файл содержит только CLSID и другую информацию о типе, необходимую для создания экземпляров COM-объектов во время выполнения.

Гораздо более вероятно, что проблема связана с NLog или с тем, как вы его вызываете из своего кода, а не с чем-то, что пошло не так в процессе компиляции VB6.

person Mike Spross    schedule 25.09.2008

Если вы думаете, что это проблема компоновщика, это должно привести к его сбою:

  1. создать новый стандартный проект (любого вида)
  2. добавить новый модуль и скопировать в него "declare" -statements
  3. компилировать

Если он не выйдет из строя, это что-то еще.

person dummy    schedule 25.09.2008

Помогло бы точное описание ошибки или скриншот происходящего.

Следует проверить, где для NLogC.DLL или C ++ DLL, которые вы построили, определено правильное соглашение о вызовах. По сути, вы не можете изменять имена функций DLL или использовать что-либо, кроме соглашения о вызовах STDCALL. Если C ++ DLL не была создана с учетом этих двух вещей, она не сможет работать с VB6.

Статья MSDN о соглашении о вызовах.

person RS Conley    schedule 26.09.2008

Ошибки «Не удается загрузить элемент управления xxx» могут быть вызваны файлами .oca, которые были созданы из другой версии .ocx, чем используется в настоящее время. В этом случае помогает удаление файлов .oca.

person Kaniu    schedule 30.09.2008