Ваша большая проблема - приведения (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 в противном случае.