如何在 C++ 程序内部设置可执行文件的兼容模式?

如何在 C++ 程序内部设置可执行文件的兼容模式?

我一直在阅读如何通过命令提示符执行此操作。我试过了。成功了。然后我尝试在 C++ 中执行此操作,但失败了。我预计这在过去曾是某个人遇到的问题,但我在其他地方没有找到这个问题和有效的答案。请告诉我以前在 C++ 中问过这个问题并得到有效回答的地方。不是针对 Visual C++。不是针对 C。我在 MS Windows 系统上使用 CodeBlocks。

答案1

只需使用reg.exe如何从命令行设置可执行文件的兼容模式?,使用 win32 API 将其转换为 C++,以下代码似乎可以使用 codeblocks 20.03 和 MINGW 4.3.5 gcc 7.3.0(2018 build)运行

#include <Windows.h>
#include <iostream>

int main() {
    HKEY hKey = NULL;
    LPCTSTR subKey = TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers");

    if (RegCreateKeyEx(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS) {
        LPCTSTR valueName = TEXT("C:\\Program Files\\MyApp\\Test.exe");
        LPCTSTR valueData = TEXT("WIN7RTM");

        if (RegSetValueEx(hKey, valueName, 0, REG_SZ, (LPBYTE)valueData, (lstrlen(valueData) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS) {
            std::cout << "String value added successfully.\n";
        } else {
            std::cout << "Failed to set the string value.\n";
        }

        RegCloseKey(hKey);
    } else {
        std::cout << "Failed to create the registry key.\n";
    }

    return 0;
}

你可以改为HKEY_CURRENT_USER强制HKEY_LOCAL_MACHINE整个系统执行,然后只能通过修改注册表来删除它,来源:程序兼容性助手 - 第二部分

有关兼容性值的列表,请参阅以下来源如何控制兼容模式

相关内容