我知道以前也有人问过类似的问题,但没有一个对我有帮助。
基本上,我需要dstpath
=%AppData%+“当前EXE名称”
但问题在于不同的字符串类型和字符串拼接
简化代码:-
#include <stdio.h>
#include <string>
#include <filesystem>
#include <Shlwapi.h>
#include <Windows.h>
using namespace std;
int main()
{
TCHAR selfPath[MAX_PATH];
TCHAR dstPath[MAX_PATH];
if (GetModuleFileName(NULL, selfPath, MAX_PATH) == 0) // Getting exe File Location
printf("Error : %ul\n", GetLastError());
filesystem::path p(selfPath);
dstPath = strcat(getenv("APPDATA"), p.filename().string().c_str()); // Here Comes The Error
printf("Src : %s\n", selfPath);
printf("Dst : %s\n", dstPath);
return 0;
}
编译器命令:-
g++-os-s-o./builds/gcc-rat-x64.exe./source/rat.cpp-std=C++17-m64-lshlwapi
编译器错误:-
error: incompatible types in assignment of 'char*' to 'TCHAR [260]' {aka 'char [260]'}
80 | dstPath = strcat(getenv("APPDATA"), p.filename().string().c_str());
不能为数组赋值。您应该使用strcpy()
复制C样式的字符串。
strcpy(dstPath, getenv("APPDATA"));
strcat(dstPath, p.filename().string().c_str());
或者可以通过snprintf()
在一行中进行连接:
snprintf(dstPath, sizeof(dstPath), "%s%s", getenv("APPDATA"), p.filename().string().c_str());
最后,tchar
和getModuleFileName
可以根据编译选项引用API的UNICODE版本。显式使用ANSI版本(char
和GetModuleFileNamea
)与std::String
和其他需要由char
组成的字符串的API一起工作更安全。