2017-10-20 25 views
-2

J'essaie d'utiliser GetUserNameEx, mais je ne peux même pas le compiler parce que j'ai eu des tas d'erreurs. Ceci est mon code:Tonnes d'erreur dans Visual Studio 2017 avec GetUserNameEx au moment de la compilation

#include <Windows.h> 
    #include <Secext.h> 
    #include <tchar.h> 
    #include <wchar.h> 

    #pragma comment(lib, "Secur32.lib") 

    int wmain(int argc, WCHAR *argv[]) 
    { 

     //GetUserNameEx() 
     EXTENDED_NAME_FORMAT nameFormat = NameDnsDomain; 
     WCHAR nameExtended[256 + 1]; 
     DWORD sizeExtended = 256 + 1; 


     if (GetUserNameEx(nameExtended, &sizeExtended)) 
     { 

      wprintf(L"%s\n", nameExtended); 
     } 
     else 
     { 
      wprintf(L"Error code: %lu\n", GetLastError()); 
     } 
return 0; 
} 

Ce sont les erreurs que je reçois en essayant de compiler:

Errors from Visual Studio 2017

Pouvez-vous me aider? On dirait que le compilateur n'a pas pu reconnaître cette fonction.

Editer: Je ne peux pas inclure toutes les erreurs car il y en a environ 48 qui n'ont rien à voir avec le code, à l'exception de la mauvaise fonction d'appel.

+1

Les questions recherchant l'aide au débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure les erreurs dans la question elle-même. – tambre

+0

Je ne voulais pas écrire 48 erreurs. Comme vous pouvez le voir dans les réponses, il y a un problème avec les définitions. –

+1

Ne pas afficher les erreurs IntelliSense. Les seules erreurs intéressantes sont les erreurs de construction. Postez-les, en tant que texte. Les futurs visiteurs à la recherche d'aide ne peuvent pas trouver cette question, car les images ne peuvent pas être facilement recherchées. Le texte peut. – IInspectable

Répondre

3

Vous incluez l'en-tête mal. La documentation contient généralement deux informations concernant les en-têtes: Le fichier d'en-tête qui déclare un symbole, ainsi que le fichier d'en-tête que vous êtes censé #include.

Dans la section Requirements:

Header: Secext.h (include Security.h)

Pour résoudre le problème, remplacez

#include <Secext.h> 

avec

#include <Security.h> 

Il est important de toujours inclure le fichier d'en-tête que vous avez dit à . Les fichiers d'en-tête modifient souvent l'environnement, et lorsque vous essayez d'inclure l'en-tête qui déclare un symbole directement, toutes sortes de choses étranges peuvent se produire.

Vous avez également un bug dans votre appel, en passant les mauvais arguments. Il devrait être plutôt:

WCHAR nameExtended[256 + 1]; 
    ULONG sizeExtended = 256 + 1; 

    if (GetUserNameExW(NameDnsDomain, nameExtended, &sizeExtended)) { 
     // ... 

ce produit Compiler l'erreur suivante:

fatal error C1189: #error: You must define one of SECURITY_WIN32, SECURITY_KERNEL, or 

(Le SECURITY_MAC arrière manque, en raison d'une mauvaise mise en forme dans un en-tête du système.)

Pour résoudre ce problème, #define le symbole préprocesseur SECURITY_WIN32 (pour les applications en mode utilisateur) avant d'inclure <Security.h>, que ce soit dans le code ou par les paramètres du projet, par exemple:

#define SECURITY_WIN32 
#include <Security.h> 

Il y a très peu d'informations au sujet de ces symboles de préprocesseur. Le commentaire le plus éclairant est de <NTSecPKG.h> lecture // Can't use the windows.h def'ns in kernel mode. à l'intérieur d'un #ifdef SECURITY_KERNEL conditionnel. SECURITY_MAC est probable à cette époque, alors que MFC était toujours destiné à être un framework multiplateforme, ciblant Windows et Mac OS "Classic". Il est d'aucune utilité pratique aujourd'hui.

3

Deux problèmes:

  1. Il semble être une question au sujet de définir SEC_ENTRY. Je crois qu'il est défini comme __stdcall. Je suis toujours en train de faire des recherches. Il est en fait résolu en incluant d'abord <sspi.h> et en définissant un modèle de sécurité. Quoiqu'il en soit, l'appel de GetUserNameEx est incorrect.

Au lieu de cela:

if (GetUserNameEx(nameExtended, &sizeExtended)) 

Il devrait être le suivant:

if (GetUserNameEx(nameFormat, nameExtended, &sizeExtended)) 

Code ajusté:

#define SECURITY_WIN32 
#include <Windows.h> 
#include <sspi.h> 
#include <secext.h> 
#include <stdio.h> 

#pragma comment(lib, "Secur32.lib") 

int wmain(int argc, WCHAR *argv[]) 
{ 

    //GetUserNameEx() 
    EXTENDED_NAME_FORMAT nameFormat = NameDnsDomain; 
    WCHAR nameExtended[256 + 1] = {}; 
    DWORD sizeExtended = ARRAYSIZE(nameExtended); 

    if (GetUserNameEx(nameFormat, nameExtended, &sizeExtended)) 
    { 
     wprintf(L"%s\n", nameExtended); 
    } 
    else 
    { 
     wprintf(L"Error code: %lu\n", GetLastError()); 
    } 
    return 0; 
} 
+0

Merci beaucoup pour votre réponse, @selbie! –

+0

Est-ce que la personne qui a déprécié cette réponse voudrait expliquer son antipathie? – selbie

+0

Peut-être parce que vous proposez d'inclure le mauvais en-tête? Personnellement, je n'aimerais pas ignorer activement la documentation. – IInspectable