gpt4 book ai didi

c++ - 如何将动态字符串转换为 wchar_t 以更改背景

转载 作者:行者123 更新时间:2023-11-30 03:30:15 25 4
gpt4 key购买 nike

我一直在网上寻找一些解决方案,但它们都是从常量字符串转换而来的。 Here's我用一段代码将字符串转换为 wchar_t 而无需额外的库。我想做的是,我想用我的背景更改我的 Windows 计算机的背景。现在我不能假设我下载的文件夹在 C:\Downloads 中,因为有些人更改了他们的下载文件夹,或者他们可能将整个文件夹移动到另一个位置。所以在第一个代码中,我试图获取 .exe 文件的路径。

string GetExePath() {
char buffer[MAX_PATH];
GetModuleFileNameA(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
return string(buffer).substr(0, pos + 1);//gets the first character in path up to the final backslash
}

接下来,我将在与 .exe 文件相同的文件夹中抓取我想要作为背景的图片。

//error on the third parameter
int return_value = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, L(string)(GetExePath() + "\\picture.png"), SPIF_UPDATEINIFILE);
  1. 错误(主动)E0040 需要一个标识符
  2. 错误(主动)E0020 标识符“L”未定义
  3. Error (active) E0254 type name is not allowed
  4. 错误(事件)E0018 需要 ')'

一段时间后,我替换了函数的返回类型,所以它会返回 wchar_t*。

const wchar_t* GetExePath() {
char buffer[MAX_PATH];
GetModuleFileNameA(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
string path = string(buffer).substr(0, pos + 1);
path += "\\HandleCamWallpaperwithgradient.png";
cout << path << endl;
wstring wide;
for (int i = 0; i < path.length(); ++i){
wide += wchar_t(path[i]);
}
const wchar_t* result = wide.c_str();
return result;
}

但是,第三个参数显示错误说

  1. 错误 E0167 “const wchar_t *”类型的参数与“PVOID”类型的参数不兼容

那我该如何解决呢?


编辑:有人认为这是重复的,但事实并非如此。 How to convert string to wstring in C++与此问题无关,因为在该线程上提问的人正在寻求特殊字符的帮助。

最佳答案

首先调用 Unicode 版本 GetModuleFileNameW(),这样您就不必进行转换。

此外,永远不要返回指向作为函数局部变量的字符串的指针(除非它是静态的)!否则你将返回一个悬空指针。相反,返回一个类似于您的第一个版本的 std::wstring。您可以使用“pointer-to-first-character”技巧将 std::wstring 直接用作缓冲区。

std::wstring GetExePath() {
std::wstring buffer(MAX_PATH, L'\0'); // reserve buffer
int len = GetModuleFileNameW(NULL, &buffer[0], buffer.size() );
buffer.resize(len); // resize to actual length
string::size_type pos = buffer.find_last_of(L"\\/");
return buffer.substr(0, pos + 1);//gets the first character in path up to the final backslash
}

第二个错误可以这样修复:

std::wstring path = GetExePath() + L"picture.png";
int return_value = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, &path[0], SPIF_UPDATEINIFILE);

SystemParametersInfoWpvParam 参数是一个指向非常量数据的指针,所以我们必须在这里再次使用“指向第一个字符的指针”技巧(避免丑陋的const_cast)。

使用 C++17,这可以写成一行:

int return_value = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (GetExePath() + L"picture.png").data(), SPIF_UPDATEINIFILE); 

其他需要改进的地方,留作练习:

  • 检查错误条件 ERROR_INSUFFICIENT_BUFFER,如 GetModuleFileName() 的注释中所述 MSDN reference因此您可以支持长度超过 MAX_PATH 的路径。

关于c++ - 如何将动态字符串转换为 wchar_t 以更改背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45136438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com