Как обновить DLL C ++, не связывая exe с файлом lib? - PullRequest
8 голосов
/ 30 июля 2009

Прежде всего, я имею в виду среду Windows и компилятор VC ++.

Что я хочу сделать, это перестроить dll Vc ++ и поддерживать совместимость с exe-файлом, который уже был связан с lib, без необходимости перестраивать exe или динамически загружать dll с помощью LoadLibrary. Другими словами, есть ли способ добавить классы и методы в dll (но не удалить их) и убедиться, что существующие точки входа остаются прежними?

Ответы [ 4 ]

8 голосов
/ 30 июля 2009

Это зависит от того, как ваш EXE-файл использовал классы из DLL. Добавление новых классов не должно влиять на существующие точки входа. Помимо этого, однако, любое следующее повлияет на размер объекта и / или макет, и, как таковое, будет изменением клиента (обратите внимание, что это технически зависит от VC, но большинство из них применимо к любой вменяемой реализации):

  • Удаление полей (даже приватных) из классов
  • Добавление новых полей (даже личных) в классы
  • Добавление новых базовых классов в существующие классы
  • Удаление базовых классов из существующих классов
  • Добавление нового виртуального метода перед существующим виртуальным методом (добавление новых виртуальных методов после существующих вполне допустимо, за исключением случая, описанного в следующем пункте)
  • Добавление нового виртуального метода в класс, который используется в качестве базового класса другим классом в той же DLL, которая также имеет виртуальные методы
  • Изменение типа существующих полей
  • Изменение подписи существующих методов
  • Создание виртуального метода не виртуальным, и наоборот
8 голосов
/ 30 июля 2009

Если вы экспортируете функции из файла DEF и вручную указываете порядковые номера, вы сможете выполнить это.

Ссылки

http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx

0 голосов
/ 30 июля 2009

Я думаю, что порядковые номера редко используются для разрешения импорта DLL - я думаю, что вы должны использовать файлы .def, чтобы компоновщик использовал их. Поэтому, если вы не меняете имена или подписи экспортируемых функций, .exe должен работать нормально.

0 голосов
/ 30 июля 2009

Пока вы не добавите экспортированные символы, порядковые номера не будут меняться. Если вы добавите экспортируемые символы через стандартный механизм dllexport, это будет трудно контролировать. Если вы используете файл символов .xpf старого стиля, вы можете контролировать порядок символов в библиотеке (хотя я не знаю это наверняка - он все равно может изменить их порядок, как ему нравится), но это сложно сделать C ++ символы таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...