假设我想制作一个打开
%localappdata%
的程序。我会做system("start %localappdata%");
但它不起作用。
我需要这个程序来打开
%localappdata%
并选择菜单(我已经做了菜单选择)。
正如其他人在评论中提到的,您不能只在传递给
%localappdata%
函数的字符串中使用 system()
宏。此外,您也不能只是将此类宏粘贴到 C++ 代码中并期望编译器解析它们,因为它们“实际上”并未定义为编译器宏。1
相反,您可以调用 WinAPI 例程来获取“本地应用程序数据”文件夹的值,然后将其写入传递给 system()
调用的字符串中。这是执行此操作的“现代”(Windows-Vista 后)方法:
#include <Windows.h>
#include <ShlObj.h>
#include <iostream>
int main()
{
wchar_t* wpath; // Recieves the address of an 'internal' buffer
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &wpath);
std::wcout << wpath << L"\n";
wchar_t wcommand[_MAX_PATH + 10];
// Note, in the below format, the escaped double quotes around the path!
swprintf(wcommand, L"start \"%s\"", wpath);
_wsystem(wcommand);
CoTaskMemFree(wpath); // It is your responsinility to free that internal buffer!
return 0;
}
如果由于某种原因,您想要使用 plian、单字节字符串,那么您可以使用“older”
SHGetFolderPath()
API 调用,如下所示。但请注意,
Microsoft 建议使用较新的方法。
#include <Windows.h>
#include <ShlObj.h>
#include <iostream>
int main()
{
char path[_MAX_PATH];
SHGetFolderPath(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, path);
std::cout << path << "\n";
char command[_MAX_PATH + 10];
sprintf(command, "start \"%s\"", path);
system(command);
return 0;
}
相反,此类路径定义宏是由 Visual Studio IDE 定义/使用的;并且,当在编译中使用时,它们在作为命令行选项(内部)传递之前首先被评估。