Я пишу проект MFC, который пытается вызвать функцию в DLL, которая будет возвращать некоторую информацию в строке. Функция в DLL выглядит следующим образом:
int GetInfo(char* Info)
Функция вернет 0 в случае успеха. Информация будет возвращена в строковом параметре. Процедура вызова выглядит следующим образом:
typedef int (WINAPI *FUNC1)(char* szInfo);HINSTANCE hinstLib;
FUNC1 GetInfo;
char szInfo[50];
hinstLib = LoadLibrary(TEXT("DevInfo.dll"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
GetInfo = (FUNC1) GetProcAddress(hinstLib, "GetInfo");
// If the function address is valid, call the function.
if (NULL != GetInfo)
{
if((GetInfo) (szInfo)) // Error here!!
{
AfxMessageBox(_T("Error Reading"));
}
}
FreeLibrary(hinstLib);
}
Этот код не имеет ошибки при компиляции и компоновке. При выполнении он выдаст ошибку «Расположение выполнения нарушения доступа 0x00000000» в указанном выше местоположении. Может кто-нибудь совет?
Вы пытались записать (или разыменовать) указатель NULL. Поскольку вы проверили все возможные значения NULL в своем вызывающем коде, скорее всего, ошибка в вызываемом коде.
Если вы проверили свой вызываемый код и там не можете найти причину исключения нулевой ссылки, подумайте, что вы, возможно, пропустили, чтобы правильно соответствовать соглашениям о вызовах. Тип указателя вашей функции должен быть точно таким же, как в вашей библиотеке:
За int GetInfo(char* Info)
typedef должен быть typedef int (*FUNC1)(char* szInfo);
Также возможно, что в буфер записывается более 50 символов (szInfo):
char szInfo [50];