2009-10-07 6 views
0

J'ai une application Win32 API dans Visual C++. Je veux créer un répertoire dans Application Common Data Directory. J'ai le code qui génère l'erreur suivante. J'ai également essayé d'ajouter '\ 0' à la fin de la chaîne, mais la même erreur apparaît.Création d'un répertoire dans Application Common Data Directory

Échec de l'assertion de débogage! Expression: (L "Chaîne n'est pas terminée par NULL" & & 0);

code:

TCHAR AppDir [MAX_PATH]; TCHAR SetPath [MAX_PATH];

ITEMIDLIST * pidl; HRESULT hRes = SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE, & pidl); if (hRes == NOERROR) { SHGetPathFromIDList (pidl, AppDir); }

strcpy_s (SetPath, AppDir);

:: strcat_s (SetPath, "\ Keylogger"); :: SHCreateDirectoryExW (hWnd, (LPCWSTR) SetPath, NULL);

:: strcat_s (SetPath, "\ SnapShot"); :: SHCreateDirectoryExW (hWnd, (LPCWSTR) SetPath, NULL);

Répondre

1

Votre gros problème est les castings (LPCWSTR) dans les appels à SHCreateDirectoryExW - ces moulages empêchent explicitement le compilateur de vous dire ce qu'est l'erreur.

Une règle générale Je souhaiterais que plus de programmeurs C++ soient compris, Ne pas typer. Sauf si tu comprends pourquoi. Jamais typé pour 'corriger' une erreur de compilation: - 99% du temps où vous n'avez pas corrigé l'erreur, vous venez de la masquer. L'utilisation de TCHAR implique que vous écrivez du code qui peut cibler UNICODE (le texte est stocké dans des champs WCHAR 16 bits) ou ANSI (où le texte est stocké dans des champs CHAR 8 bits). Le préfixe str dans les fonctions strxxx_s signifie cependant que vous utilisez des fonctions de chaîne qui ne traitent que des chaînes de 8 bits. Les fonctions de W sur le Shell sont cependant la façon dont les API Windows annoncent que les fonctions attendent des chaînes UNICODE. Pour corriger votre programme, vous devez sélectionner (a) ANSI cible, (b) UNICODE cible ou (c) cibler les deux en fonction des paramètres du compilateur et les réécrire de manière appropriée. L'option 'les deux' serait écrite:

TCHAR AppDir[MAX_PATH]; 
TCHAR SetPath[MAX_PATH]; 
ITEMIDLIST* pidl; 
HRESULT hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE ,&pidl); 
SHGetPathFromIDList(pidl, AppDir); 
_tcscpy_s(SetPath,AppDir); 
_tcscat_s(SetPath,_T("\Keylogger")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 
_tcscat_s(SetPath,_T("\SnapShot")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 

Nous avons supprimé le typage (incorrect). Remplacé les fonctions strxxx_s avec les versions _tcsxxx_s. Et des littéraux de chaîne enveloppés dans la macro _T() qui garantit que ce sont des chaînes étendues lorsque _UNICODE est défini et des chaînes ansi normales dans le cas contraire.

+0

Merci pour votre précieux commentaire. –

0

Il semble que vous mixiez des fonctions de chaîne mono-octet et unicode.

strcpy_s et strcat_s est utilisé pour les chaînes d'un seul octet

SHCreateDirectoryExW est utilisé pour les chaînes larges unicode.

Essayez d'utiliser SHCreateDirectoryEx.

+0

Yeh! vous avez raison, merci beaucoup. Pour votre commentaire rapide et précis. –

Questions connexes