Error de comprobación en tiempo de ejecución # 0 cargando QueryFullProcessImageName desde kernel32.dll

Tengo una aplicación que necesita ejecutarse tanto en WinXP como en Vista64. Mi programa requiere QueryFullProcessImageName () para funcionar en Vista pero no en XP.

Intento cargar QueryFullProcessImageName () (en lugar de vincular estáticamente) a través de kernel32.dll para que el mismo ejecutable pueda ejecutarse tanto en WinXP como en Vista. El código que lo carga es:

//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;
}

the typedef es

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

Desafortunadamente, recibo un error de tiempo de ejecución en Vista cuando el puntero de la función está desreferenciado:

Falla de verificación en tiempo de ejecución # 0: el valor de ESP no se guardó correctamente en una llamada de función. Esto suele ser el resultado de llamar a una función declarada con una convención de llamada con un puntero de función declarado con una convención de llamada diferente.

El typedef es directamente del archivo .h, así que no puedo entender por qué está en mal estado. ¿Alguna ayuda? He probado toneladas de variantes pero no tuve suerte.

Respuestas a la pregunta(1)

Su respuesta a la pregunta