Могу ли я создать Dll с VC ++ 2008 и использовать его в VC ++ 6? - PullRequest
1 голос
/ 02 апреля 2012

Я сделал DLL с VC ++ 2008, и когда я использую ее в консольном приложении VC ++ 6.0, возникает исключение:

(msvcr90.dll): 0xc0000005: нарушение прав доступа

Ответы [ 2 ]

5 голосов
/ 02 апреля 2012

Access Violation в этом случае может означать очень много вещей, и ссылка msvcr90.dll может быть очень вводящей в заблуждение.Если вы передадите недопустимые данные в любую из функций стандартной библиотеки MSVC, нарушение доступа произойдет в пределах msvcr90.dll, а не в вашем коде (при просмотре трассировки стека или просмотре информации об исключении.

При этомтеоретически не должно быть проблем с использованием VC9 DLL в VC ++ 6, поскольку ABI не изменился и формат PE такой же. У вас могут быть проблемы, если msvcrt9.dll не поддерживается на вашей платформе (например, если вызапускаете MSVC6 в Windows NT), но в противном случае это означает, что вам нужно просмотреть свой код.

Я имею в виду следующее: подключите отладчик и посмотрите, что происходит под сценой!

Oneпримечание: при динамическом использовании разных версий библиотек MSVC НЕ ДОЛЖНО размещаться данные в одной библиотеке и освобождать их в другой, поскольку не гарантируется, что они используют одну и ту же кучу, и вы можете получить повреждение памяти (и ошибки Access Violation)довольно легко, как это. Это также означает, что если вы пишете C ++, вы не должны создавать объект, а затем передать еговозвращая значение вызывающему приложению, поскольку это произойдет за кулисами.

3 голосов
/ 03 апреля 2012

Если вы хотите создать DLL с версией Visual C ++ X и использовать ее в версии Visual C ++ Y , у вас есть несколько вариантов:

  1. Постройте DLL, которая предоставляет чистый интерфейс C .Вы можете использовать C ++ внутри DLL, но общедоступный интерфейс должен быть чисто C (поэтому, например, вы не можете выбросить исключения, пересекающие границы DLL).
  2. Построить DLL * COM (возможно, с помощью таких инструментов, как ATL).
  3. Создание библиотеки DLL с использованием COM-подобных методов, т.е. предоставление только абстрактных интерфейсов и фабрикифункции из вашей DLL (этот метод объясняется в этой статье в CodeProject "HowTo: Экспорт классов C ++ из DLL" , в частности в параграфе "C ++ Mature Approach: Использование абстрактного интерфейса" ).

Также важно отметить, что код, который выделяет память, и код, который освобождает память, должны использовать один и тот же распределитель .

...