我对此很新,对于下面可怕的代码感到抱歉。我试图获取FOLDERID_Profile的默认路径,然后将“\ test.exe”添加到它的末尾。然后我需要使用它作为复制文件的路径。我能够使用pSHGetKnownFolderPath方法将配置文件目录存储在PWSTR user_dir中。问题是,这不是复制功能可接受的字符串格式。
所以我使用下面的代码非常粗略地尝试将其转换为复制功能可以使用的东西。
strcat((char *)user_dir,"\\test.exe");
test7 = (LPCWSTR)user_dir;
MessageBox(NULL,test7,L"WR test file",MB_OK);
我在使用CopyFile之前使用消息框检查路径(currentpath,test7,false);但是这给了我㩃瑜獥硥。我目前正在使用
CopyFileW(currentpath,L"C:\\Users\\Jenia\\test.exe",false);
作为一种解决方法,但我真的需要它在其他计算机上工作......
我知道我再次弄乱我的ANSI vs Unicode格式,请告诉我如何最好地实现这一目标。如果您希望我发布整个代码块,请告诉我,但在我运行strcat方法之前,user_dir具有正确的路径,只是没有copy方法的文件名。
以下更完整的代码:
#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>
#include <Shlobj.h>
LPCWSTR test7 = 0;
PWSTR user_dir = 0;
HMODULE hndl_shell32;
lpSHGetKnownFolderPath pSHGetKnownFolderPath;
hndl_shell32 = LoadLibrary(L"shell32");
if (NULL != hndl_shell32)
{
pSHGetKnownFolderPath = (lpSHGetKnownFolderPath)
GetProcAddress(hndl_shell32, "SHGetKnownFolderPath");
if(pSHGetKnownFolderPath != NULL)
{
if (SUCCEEDED(pSHGetKnownFolderPath(
FOLDERID_Profile,
0,
NULL,
&user_dir)))
{
//I think this is the problem here
strcat((char *)user_dir,"\\test.exe");
test7 = (LPCWSTR)user_dir;
MessageBox(NULL,test7,L"WR test file",MB_OK);
}
}
else
{
fprintf(stderr, "Failed to locate function: %d\n",
GetLastError());
}
}
else
{
fprintf(stderr, "Failed to load shell32.dll: %d\n", GetLastError());
}
答案 0 :(得分:1)
这里的错误太多了。 strcat
填充的指针上不能SHGetKnownFolderPath
。假设所有变量都是Unicode,这应该适用于任何字符集的项目:
LPWSTR test7 = 0;
WCHAR user_dir[MAX_PATH];
...
SHGetKnownFolderPath(... &test7);
...
wcscpy(user_dir, test7);
wcscat(user_dir, L"\\test.exe");
MessageBoxW(NULL,test7,L"WR test file",MB_OK);
不要忘记释放由test7
填充的指针SHGetKnownFolderPath
。
答案 1 :(得分:0)
这显示了完成任务的基本方法;你需要根据自己的需要进行调整。
#include <ShlObj.h>
#include <strsafe.h>
void ShowTestPath()
{
PWCHAR user_dir = NULL;
WCHAR test_file_path[MAX_PATH];
if (FAILED(SHGetKnownFolderPath(FOLDERID_Profile, 0, NULL, &user_dir)))
return;
if (FAILED(StringCchCopyW(test_file_path, MAX_PATH, user_dir)))
{
CoTaskMemFree(user_dir);
return;
}
CoTaskMemFree(user_dir);
if (FAILED(StringCchCatW(test_file_path, MAX_PATH, L"\\test.exe")))
return;
MessageBoxW(NULL, test_file_path, L"WR test file", MB_OK);
}