Обратная совместимость в dll - PullRequest
3 голосов
/ 01 июня 2010

У меня есть три библиотеки.

  • a.dll - выпущено много лет назад
  • b.dll - выпущено не так много лет
  • c.dll - выпущен в ближайшее время

Каждый из них содержит одну и ту же функцию - к сожалению, с разными параметрами. поэтому у меня есть следующие методы

aMethod(param1)
aMethod(param1, param2)
aMethod(param1, param2, param3)

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

У кого-нибудь есть совет, как я могу элегантно решить эту проблему?

Ответы [ 3 ]

1 голос
/ 07 июня 2010

Вы можете перегружать сигнатуры функций в DLL. Однако функция names , экспортируемая из DLL, должна быть уникальной - это требование Windows, а не требование Delphi. Итак, объявите ваши функции в Delphi как перегрузки, но убедитесь, что они экспортируются с конкретными, уникальными именами, которые вы определяете. Клиенты, которые импортируют из вашей новой многофункциональной библиотеки DLL, должны импортировать, используя те уникальные имена, которые вы определили.

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

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

Скорее всего, вы не сможете создать новую DLL-библиотеку, совместимую в двоичном формате со всеми тремя вашими предыдущими версиями DLL, поскольку старые исполняемые двоичные файлы ссылаются на одно и то же имя функции, но ожидают другого поведения (разные списки параметров).

Обратите внимание также, что если ваши три версии dll на самом деле имеют разные имена файлов (a, b, c), то точка несколько спорная - привязка статической функции связывается с именем dll + именем функции. Если вы хотите, чтобы ваша новая DLL работала со старыми exe-файлами, планируете ли вы скопировать новую dll три раза в имена файлов a, b и c? Это кажется странным и контрпродуктивным. Как и со спящими собаками, пусть лежат старые DLL. Оставьте их в покое, если вам абсолютно не нужно исправлять критическую ошибку.

0 голосов
/ 01 июня 2010

Сделайте этот метод более общим - измените его на что-то подобное - я не знаком с Delphi, поэтому этот пример на C #:

aMethod( int version, object args)

или в C:

aMethod (int version, void** args)

Тогда в зависимости от версии вы можете использовать кастинг. Обратите внимание, что аргументы также могут быть объектами коллекции.

НТН.

0 голосов
/ 01 июня 2010

Пока я не знаю, что вы можете использовать перегрузку методов, вам нужно только реализовать предыдущую и новую версии в одной и той же DLL. В Delphi вам нужно использовать директиву перегрузки. Смотрите эту ссылку:

http://delphi.about.com/od/objectpascalide/a/overloading.htm

...