Нарушение прав доступа при чтении
Есть библиотека со статической линковкой (исходников нет) и файлы заголовков для С++. Мне нужно сделать из неё библиотеку с динамической линковкой.
Сделал динамическую библиотеку с экспортом функций.
#pragma comment(lib, "rtl2.lib")
D3RTL_API msp_ERROR sp_Startup(void);
D3RTL_API msp_ERROR sp_Startup()
{
return msp_Startup(); // Вот тут возникает ошибка
}
Создал консольное приложение с динамическим подключением библиотеки.
typedef msp_ERROR (*TESTFUNCTION)(void);
DWORD err;
HINSTANCE hDll = LoadLibrary(L"F:\\Projects\\msp\\Debug\\msp.dll");
if (hDll != NULL)
{
printf("Library was loaded\n");
}
else
{
err = GetLastError();
printf("Couldn't load dll. Error code %d\n", err);
return -1;
}
// получение указателя на функцию библиотеки
TESTFUNCTION lpTestFunction = (TESTFUNCTION)GetProcAddress(hDll, "?sp_Startup@@YAHXZ");
if (lpTestFunction != NULL)
{
msp_ERROR e = lpTestFunction();
cout << "error = " << e << endl;
}
// освобождение дескриптора
FreeLibrary(hDll);
return 0;
Дома проект под Win 7 и MS VC 2012 работает, а на работе Win XP MS VC 2010 не работает. Выдаёт следующую ошибку:
Необработанное исключение в "0x1001c462 (msp.dll)" в "test.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".
При этом, если в консольном приложении подключить статическую библиотеку msp.lib (без динамической), то всё работает.
Посему два вопроса:
- Может, можно из статической в динамическую библиотеку проще преобразовать?
- Как исправить ошибку?
Источник: Stack Overflow на русском