dll отлично работает в проекте VS2010, но дает нарушения прав доступа в приложении VS6.

Я создавал dll для USB-устройства за последние несколько недель, устройство поставлялось с собственной dll, которую я использовал для создания своей собственной dll в VS2010, затем я создал тестовое приложение, которое использует указанную dll в 2010 году, чтобы заставить его работать . Он работает хорошо, однако теперь мне нужно использовать его в проекте VS6, когда я его использую, я получаю нарушения прав доступа, я воссоздал dll в VS6, чтобы посмотреть, поможет ли это, это позволило мне войти в код, как только он попадает в строку в моей dll, которая вызывает стороннюю dll, это вызывает нарушение прав доступа, я только что попытался создать фабричную функцию для создания абстрактного интерфейса для моей dll, но я снова получаю нарушения прав доступа. Я новичок в dll, и у меня совершенно нет идей, и помощь или понимание будут очень полезны...


person Perry Ward    schedule 14.08.2014    source источник
comment
Если вы передаете или возвращаете значения из экспортированных функций DLL, эти значения должны быть универсальными типами Windows, такими как LONG, DWORD, BOOL и т. д., и указателями на эти типы. Если вы передаете классы С++, то вам не повезло. Вам нужно скомпилировать все для VS6.   -  person PaulMcKenzie    schedule 14.08.2014
comment
т.е. в C++ интерфейсы между dll несовместимы в двоичном виде.   -  person cageman    schedule 14.08.2014
comment
вы смешиваете библиотеки времени выполнения, это плохо. В вашем случае это очень плохо, так как от VC6 до VS2010 существует большая разница между временем выполнения VC6 и временем выполнения VS2010. VC 6 действительно очень старый, ваша сторонняя DLL также не должна быть написана в VC6. Возможно, вам потребуется обновить проект VC 6 до VC 2010.   -  person Matt    schedule 14.08.2014


Ответы (1)


Чтобы заставить DLL, созданную в более поздней версии Visual Studio, работать с Visual Studio 6, можно закодировать DLL в общем виде с точки зрения параметров, передаваемых и возвращаемых в экспортированные функции DLL.

Например, Windows API описывает определенные типы переменных. Эти типы включают DWORD, LONG, BOOL, DWORD_PTR и т. д. Включены различные типы указателей строк, такие как LPCSTR. Также в этот список включены указатели на эти различные типы, такие как LPLONG, LPBYTE, LPVOID и т. д.

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

Например, если вы передаете объекты C++ (объекты стандартной библиотеки или даже ваши собственные объекты), это недопустимо, если вы хотите, чтобы эта DLL работала в нескольких версиях Visual Studio.

person PaulMcKenzie    schedule 14.08.2014
comment
Большое спасибо за помощь, у меня есть еще кое-что, что нужно попробовать :), нормально ли, чтобы dll использовала объекты C++ внутри себя? пока он не пытается пройти и вернуть эти переменные без предварительного преобразования их обратно в один из этих типов? - person Perry Ward; 15.08.2014
comment
@PerryWard Хорошо то, что DLL может использовать что угодно внутри (шаблоны, исключения, STL, повышение и т. д.). - person PaulMcKenzie; 19.08.2014