使用NVAPI SDK检索全局配置文件设置(显示在Nvidia控制面板中)时出现问题

时间:2017-04-20 17:22:24

标签: c++ nvidia nvapi

我想使用NVIDIA的 NVAPI SDK 来检索NVIDIA控制面板的3D设置'中显示的所有设置。 全球个人资料。

enter image description here

参考文档在此处:NVAPI Driver Settings (DRS) APIs

来源

这是我到目前为止所做的,主要是基于我在网络上找到的样本:

#include <Windows.h>
#include <string>
#include "nvapi.h"
#include "NvApiDriverSettings.h"

NvDRSSessionHandle _session;
NvDRSProfileHandle _profile;

int main()
{
    if (NvAPI_Initialize() != NVAPI_OK)
        throw std::runtime_error("NvAPI: NvAPI can't be initialized");

    if (NvAPI_DRS_CreateSession(&_session) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't create NvAPI session");
    if (NvAPI_DRS_LoadSettings(_session) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't load system settings");

    if (NvAPI_DRS_GetCurrentGlobalProfile(_session, &_profile) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't get global profile");

    NVDRS_PROFILE profileInformation = {0};
    profileInformation.version = NVDRS_PROFILE_VER;
    if (NvAPI_DRS_GetProfileInfo(_session, _profile, &profileInformation) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't get current global profile information");

    if(profileInformation.numOfSettings> 0)
    {
        NVDRS_SETTING* setArray = new NVDRS_SETTING[profileInformation.numOfSettings];
        NvU32 numSetRead = profileInformation.numOfSettings,i;
        setArray[0].version = NVDRS_SETTING_VER;
        if (NvAPI_DRS_EnumSettings(_session, _profile, 0, &numSetRead, setArray) != NVAPI_OK)
            throw std::runtime_error("NvAPI: Can't get profile setting enum");

        for(i=0; i<numSetRead; i++)
        {
            if(setArray[i].settingLocation!=NVDRS_CURRENT_PROFILE_LOCATION)
            {
                continue;
            }
            NvAPI_DRS_GetSettingNameFromId(setArray[i].settingId, &setArray[i].settingName);
            wprintf(L"Setting Name: %s\n", setArray[i].settingName);
            printf("Setting ID: %X\n", setArray[i].settingId);
            printf("Predefined? : %d\n", setArray[i].isCurrentPredefined);
            switch(setArray[i].settingType)
            {
            case NVDRS_DWORD_TYPE:
                printf("Setting Value: %X\n", setArray[i].u32CurrentValue);
                break;
            case NVDRS_BINARY_TYPE:
                {
                    unsigned int len;
                    printf("Setting Binary (length=%d) :", setArray[i].binaryCurrentValue.valueLength);
                    for(len=0; len<setArray[i].binaryCurrentValue.valueLength; len++)
                    {
                        printf(" %02x", setArray[i].binaryCurrentValue.valueData[len]);
                    }
                    printf("\n");
                }
                break;
            case NVDRS_WSTRING_TYPE:
                wprintf(L"Setting Value: %s\n", setArray[i].wszCurrentValue);
                break;
            }
        }
    }
    printf("\n");
    // Clean up
    NvAPI_DRS_DestroySession(_session);
    _session = 0;
    return 0;
}

控制台输出

这是我目前得到的输出:

Setting Name: Vertical Sync Tear Control
Setting ID: 5A375C
Predefined? : 0
Setting Value: 96861077
Setting Name: Vertical Sync
Setting ID: A879CF
Predefined? : 0
Setting Value: 8416747
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 80303A19
Predefined? : 1
Setting Value: 1
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 80857A28
Predefined? : 1
Setting Value: 1
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 809D5F60
Predefined? : 1
Setting Value: 1

问题

某些设置名称正确显示(???...),并且大多数似乎都缺失(环境遮挡,各向异性,电源管理等)。

我是否收到了错误的个人资料,或者是否可能未正确初始化?

相关问题

有些问题:

  • NvAPI_DRS_GetCurrentGlobalProfileNvAPI_DRS_GetBaseProfile之间是否有根本区别?他们似乎必须做同样的事情。
  • 当前全局配置文件是否实际上与我打开NVIDIA控制面板时看到的全局参数相对应?

2 个答案:

答案 0 :(得分:2)

您的阵列有未初始化的内存

NVDRS_SETTING* setArray = new NVDRS_SETTING[profileInformation.numOfSettings];

这意味着您可以在其中找到任何类型的数据(因此您正在打印的无效字符串)。

要么考虑零初始化

NVDRS_SETTING*setArray = new NVDRS_SETTING[profileInformation.numOfSettings];
// Remember `setArray` is a pointer
memset(setArray, 0, sizeof(*setArray) * profileInformation.numOfSettings);

或使用std::vector,在这种情况下,它也会对结构进行零初始化(尽管有一个明确的构造函数来完成这项工作会使事情变得更容易和更可靠)。

最后考虑跳过无效条目,您可能也想跳过无效的命名条目(现在可以可靠地检测)

if (setArray[i].settingName[0] == 0x00)
  continue;
  • NvAPI_DRS_GetCurrentGlobalProfile和NvAPI_DRS_GetBaseProfile之间是否存在根本区别?他们似乎必须做同样的事情。

来自NVAPI guide

  

基本配置文件是始终存在且不与特定关联的配置文件   应用。基本配置文件中的设置将应用于系统上的所有进程   自动。

     

没有应用程序的配置文件称为全局配置文件。来自Global的设置   配置文件应用于系统上的所有进程,但仅在选择该配置文件时才应用   系统中的当前全局配置文件。

所以在你的情况下它可能是,但是如果你设置一个不同的当前全局配置文件(cfr。NvAPI_DRS_SetCurrentGlobalProfile)则不会。

  • 当前全局配置文件是否实际上与我打开NVIDIA控制面板时看到的全局参数相对应?

大多数情况下,许多其他高级设置都隐藏在控制面板中,但可通过代码和/或其他高级工具访问。更深层次可能涉及未记录的功能,但如果你不知道自己在做什么,你可能会破坏很多东西。

答案 1 :(得分:0)

setArray[i].settingName是unsigned short类型的数组。我相信将它转换为char *(带wprintf和%s)是问题的来源。