如何在 system() 调用中使用 %localappdata%?

问题描述 投票:0回答:1

假设我想制作一个打开

%localappdata%
的程序。我会做
system("start %localappdata%");
但它不起作用。

我需要这个程序来打开

%localappdata%
并选择菜单(我已经做了菜单选择)。

c++ winapi terminal
1个回答
0
投票

正如其他人在评论中提到的,您不能只在传递给

%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; }


1

相反,此类路径定义宏是由 Visual Studio IDE 定义/使用的;并且,当在编译中使用时,它们在作为命令行选项(内部)传递之前首先被评估。

© www.soinside.com 2019 - 2024. All rights reserved.