C语言文件路径问题:如何拼接EXE路径与图片路径实现壁纸更换
问题解决:C语言拼接EXE所在目录与图片路径
你的代码核心问题是直接在完整EXE路径后拼接图片路径,但GetModuleFileNameW返回的路径包含EXE文件名(比如C:\demo\wallpaper.exe),直接拼接会变成C:\demo\wallpaper.exe//gwegus/pic.png,这显然不是正确的图片路径。需要先提取EXE所在的目录,再拼接图片路径。
修正步骤:
- 找到路径中最后一个反斜杠
\的位置,截断路径到目录部分 - 拼接目标图片的相对路径
- 修复宽字符打印的问题(
printf无法正确输出wchar_t类型,改用wprintf)
修正后的代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <conio.h> #include <shlwapi.h> // 链接shlwapi.lib,用于PathRemoveFileSpecW函数 #pragma comment(lib, "shlwapi.lib") int main() { HMODULE module = GetModuleHandleW(NULL); wchar_t path[MAX_PATH]; GetModuleFileNameW(module, path, MAX_PATH); // 移除路径中的EXE文件名,得到程序所在目录 PathRemoveFileSpecW(path); // 拼接图片路径(如果图片在子文件夹gwegus里,就改成L"\\gwegus\\pic.png") wcscat_s(path, MAX_PATH, L"\\pic.png"); // 设置桌面壁纸 int retSysCall = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void*)path, SPIF_UPDATEINIFILE); // 正确打印宽字符路径 wprintf(L"%s\n", path); _getch(); return 0; }
关键说明:
PathRemoveFileSpecW是Windows提供的API,专门用于移除路径中的文件名部分,比手动查找反斜杠更可靠- 使用
wcscat_s替代wcscat,避免缓冲区溢出风险(更安全) - 若图片在程序目录的子文件夹内,只需修改拼接的路径字符串即可
内容的提问来源于stack exchange,提问作者Garry
相关产品推荐
相关产品推荐

