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

StackOverflow https://stackoverflow.com/questions/131358

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Я бы попробовал кое-что подправить Скомпилировать варианты, найденные в Проект, Характеристики меню, Скомпилировать панель, чтобы увидеть, дают ли они какие-либо дополнительные подсказки относительно того, что происходит не так.

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

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

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

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

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

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

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

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

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

Если не сломается, значит, дело в чем-то другом.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top