Ошибка проверки времени выполнения # 0 при загрузке QueryFullProcessImageName из kernel32.dll - PullRequest
7 голосов
/ 30 марта 2009

У меня есть приложение, которое должно работать как на WinXP, так и на Vista64. Моя программа требует QueryFullProcessImageName () для работы в Vista, но не в XP.

Я пытаюсь загрузить QueryFullProcessImageName () (вместо статического связывания) через kernel32.dll, чтобы один и тот же исполняемый файл мог работать как в WinXP, так и в Vista. Код, который загружает это:

//only gets called on vista
bool LoadQueryFullProcessImageName()
{
  HMODULE hDLL = LoadLibrary("kernel32.dll");
  if (!hDLL) return(0);

  //Now use pointer to get access to functions defined in DLL
  fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
  if (!fpQueryFullProcessImageName) 
     return false;

  return true;
}

typedef равен

typedef WINBASEAPI
BOOL (*LPQueryFullProcessImageName)(
    __in HANDLE hProcess,
    __in DWORD dwFlags,
    __out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName,
    __inout PDWORD lpdwSize
    );

К сожалению, я получаю ошибку во время выполнения в Vista, когда указатель на функцию разыменовывается:

Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции. Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах с указателем функции, объявленным с другим соглашением о вызовах.

typedef прямо из .h файла, поэтому я не могу понять, почему он портится. Любая помощь? Я перепробовал множество вариантов, но не повезло.

1 Ответ

21 голосов
/ 30 марта 2009

Вы должны изменить typedef на

typedef BOOL (WINAPI *LPQueryFullProcessImageName)(
     HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize );

WINBASEAPI используется для объявления статических зависимостей и не определяет соглашение о вызовах __stdcall. Вы используете GetProcAddress (), поэтому статическая зависимость вас не интересует, но вам все равно нужен __stdcall для правильного вызова.

...