【问题标题】:Use wchar_t *buff with variable将 wchar_t *buff 与变量一起使用
【发布时间】:2021-09-28 15:02:09
【问题描述】:

我用那里的线条来改变Windows的壁纸

    const wchar_t *path = L"C:\\Users\\Prince 2 lu\\Desktop\\SDL\\bin\\image\\wallpaper.png";
    SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void *)path, SPIF_UPDATEINIFILE);

此代码在这里 ^ 完全工作 但是代码

SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, "C:\\Users\\Prince 2 lu\\Desktop\\SDL\\bin\\image\\wallpaper.png", SPIF_UPDATEINIFILE);

char *buff = "C:\\Users\\Prince 2 lu\\Desktop\\SDL\\bin\\image\\wallpaper.png";
SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, buff, SPIF_UPDATEINIFILE);

不起作用,我不知道为什么,如果有人知道为什么... 但我想用一个变量来定义路径 (因为路径文件可以为用户更改) 我想在 char* 中定义路径(壁纸的文件路径) 代码 (如果 buff 只是一个 char 指针) char *buff = file.path;

wchar_t *path = buff;

不起作用,有人有解决办法吗?


编译器:MingGW64

操作系统:Windows 10 B4 位

【问题讨论】:

  • 什么 buff?你需要它做什么? 如何它不起作用?
  • 顺便说一句,知道数组(假设buff 是一个数组)会自动衰减为指向其第一个元素的指针可能会很好。如果buffwchar_t 的数组,则不需要path,但可以在对SystemParametersInfoW 的调用中直接使用buff
  • 您描述的代码应该可以工作。请显示一些更相关的代码。阅读minimal reproducible example 是什么以及为什么发布它很有用。你检查SystemParametersInfoW的返回值了吗?如果你这样做了,你是否检查了GetLastError 的值?你读过这个:docs.microsoft.com/en-us/windows/win32/api/winuser/…
  • 什么是file.path?它指向哪里?如果pathwchar_t*,为什么char *buff?你没有收到编译器警告吗?
  • 您根本不需要使用 char*。使用 wchar_t* 和 wchar_t 版本的 snprintf - swprintf

标签: c windows winapi


【解决方案1】:

问题标题是use wchar_t *buff with variable,但这正是你所做的所做的。

char *buff = "C:\\Users\\Prince 2 lu\\Desktop\\SDL\\bin\\image\\wallpaper.png";
SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, buff, SPIF_UPDATEINIFILE);

这是错误的,因为buff 是指向char 的指针,但SystemParametersInfoW(SPI_SETDESKWALLPAPER,... 想要指向wchar_t 的指针。

所以要么你使用SystemParametersInfoA,要么你需要这个:

wchar_t *buff = L"C:\\Users\\Prince 2 lu\\Desktop\\SDL\\bin\\image\\wallpaper.png";
SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void*)buff, SPIF_UPDATEINIFILE);

不要混淆 char(普通 8 位字符)和 wchar_t(宽 16 位字符)。

【讨论】:

  • 是的,但问题是路径 ""C:\\Users\\Prince 2 lu\\........." 仅用于测试,我的问题是定义buff 变量(每个人的壁纸路径)在这里你说 L"string" 但我想要 L(my variable) 你看到了吗?
  • buff 必须指向一个宽字符字符串。也许你应该告诉 s 你想要达到什么确切。此答案回答了您的问题,解释了您的代码为何不起作用并提供了解决方案。
  • 我可以使用 mbstowcs() 将 char 字符串更改为宽 char 字符串并将 buff 定义为 Var 吗?
  • @Prince2lu 是的,你可以。但最好从一开始就使用宽字符串。
  • 如果你根本不想使用宽字符,你可以使用SystemParametersInfoA(不是最后的A而不是W),然后你可以使用char*
猜你喜欢
  • 2020-09-13
  • 2021-04-06
  • 2014-09-05
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2021-01-08
  • 2013-06-09
相关资源
最近更新 更多