Создание каталога в общем каталоге данных приложения - PullRequest
0 голосов
/ 07 октября 2009

У меня есть приложение Win32 API в Visual C ++. Я хочу создать каталог в Application Common Data Directory. У меня есть код, который генерирует следующую ошибку. Я также пытался добавить '\ 0' в конце строки, но появляется та же ошибка.

Ошибка отладочного подтверждения! Выражение: (L «Строка не завершена NULL» && 0);

код:

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, "\ кейлоггер"); :: SHCreateDirectoryExW (HWND (LPCWSTR) SetPath, NULL);

:: strcat_s (SetPath, "\ Snapshot"); :: SHCreateDirectoryExW (HWND (LPCWSTR) SetPath, NULL);

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Ваша большая проблема - приведения (LPCWSTR) в вызовах SHCreateDirectoryExW - эти приведения явно запрещают компилятору сообщать вам, в чем заключается ошибка.

Общее правило, которое хотелось бы понять большему количеству программистов на С ++: «Не набирай». Если вы не понимаете, почему. Никогда не указывайте, чтобы «исправить» ошибку компилятора: - 99% времени, когда вы не исправляли ошибку, вы просто ее скрывали.

Анализ кода с начала: Использование TCHAR подразумевает, что вы пишете код, который может предназначаться для UNICODE (текст хранится в 16-битных полях WCHAR) или сборок ANSI (где текст хранится в 8-битных полях CHAR). однако префикс str в функциях strxxx_s означает, что вы используете строковые функции, которые работают только с 8-битными строками. Однако символы W для функций Shell - это то, как Windows API объявляют, что функции ожидают строки UNICODE.

Чтобы «исправить» вашу программу, вам нужно выбрать (а) целевой ANSI, (б) целевой UNICODE или (в) целевой в зависимости от настроек компилятора и переписать его соответствующим образом. «Оба» вариант будет написано:

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);

Мы отбросили (неправильное) приведение типов. Заменены функции strxxx_s версиями _tcsxxx_s. И обернутые строковые литералы в макросе _T(), который гарантирует, что они являются широкими строками, когда определено _UNICODE, и обычные строки ANSI в противном случае.

0 голосов
/ 07 октября 2009

Кажется, что вы смешиваете однобайтовые и юникодные строковые функции.

strcpy_s и strcat_s используется для однобайтовых строк

SHCreateDirectoryExW используется для широких строк в Юникоде.

Попробуйте использовать SHCreateDirectoryEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...