Странные проблемы со сборкой VB6 (связанные с nlog) - PullRequest
0 голосов
/ 25 сентября 2008

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

Вкратце, проблема, с которой я сталкиваюсь, заключается в том, что у меня возникают проблемы при создании компонентов 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 »для деталей». Когда я поднимаю файл журнала, все, что там есть, это: «Не удается загрузить control xxx». Интересно, что все ссылки на этот конкретный элемент управления исчезают из этого конкретного проекта, что приводит к ошибкам компиляции, если я попытаюсь собрать его заново.

Ответы [ 6 ]

2 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

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

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

0 голосов
/ 26 сентября 2008

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

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

Если он не падает, это что-то еще.

0 голосов
/ 25 сентября 2008

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

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

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

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

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

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

0 голосов
/ 25 сентября 2008

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

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

...