首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NvAPI_DISP_GetDisplayConfig?

如何使用NvAPI_DISP_GetDisplayConfig?
EN

Stack Overflow用户
提问于 2012-05-24 11:57:27
回答 3查看 1.6K关注 0票数 1

在使用NVAPI时,我在NvAPI_DISP_GetDisplayConfig上遇到了问题。我在第二个打给AppCrash的电话上得到了一个NvAPI_DISP_GetDisplayConfig。似乎不知道为什么。

代码语言:javascript
复制
NvU32 count = 0;
status = NvAPI_DISP_GetDisplayConfig(&count, NULL);
if (status != NVAPI_OK) 
    PrintError(status);
printf("Configs: %i\n", count);
NV_DISPLAYCONFIG_PATH_INFO *configinfos = new NV_DISPLAYCONFIG_PATH_INFO[count];
configinfos[0].version = NV_DISPLAYCONFIG_PATH_INFO_VER;
status = NvAPI_DISP_GetDisplayConfig(&count, configinfos);
if (status != NVAPI_OK) 
    PrintError(status);

在我的系统中,第一次呼叫后计数=2。NvAPI_DISP_GetDisplayConfig上的注释说:

NVAPI_INTERFACE NvAPI_DISP_GetDisplayConfig( __inout NvU32 * pathInfoCount, __out_ecount_full_opt *pathInfoCount NV_DISPLAYCONFIG_PATH_INFO * pathInfo ) 描述:此API允许调用方检索当前全局显示。 配置。 用法:调用者可能需要调用三次才能获取所需的所有 配置细节如下: 第一次传递:调用方应该使用NvAPI_DISP_GetDisplayConfig()集调用pathInfo () 若要空,则获取pathInfoCount。 第二次传递:为pathInfo分配与 pathInfoCount(从第一次传递)到获取//!//!targetInfoCount。如果 需要sourceModeInfo分配内存,也可以将其初始化为NULL。 第三次通过(可选,只有在需要目标信息时才需要):分配 targetInfo的内存相对于 targetInfoCount(从第二关开始)。支持操作系统: Windows及更高版本

谢谢。

编辑:我还尝试将configinfos.sourceModeInfo = NULL设置为无效。我还试图对数组进行迭代,将所有的.version和.sourceModeInfo设置为无效(在我看到的文档中的一个示例,只设置了数组中第一项的版本)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-17 20:12:58

这应该适用于你:

代码语言:javascript
复制
NvAPI_Status status = NVAPI_OK;
NvU32 deviceCount = 0;
NV_DISPLAYCONFIG_PATH_INFO_V2 *  pathInfo = NULL;

status = NvAPI_Initialize();
if (status == NVAPI_OK) {
    status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);
    if ((status == NVAPI_OK) && (deviceCount > 0)) {
        pathInfo = new NV_DISPLAYCONFIG_PATH_INFO_V2[deviceCount];
        for (int i = 0; i < deviceCount; i++)
        {
            pathInfo[i].targetInfo = 0;
            pathInfo[i].targetInfoCount = 0;
            pathInfo[i].version = NV_DISPLAYCONFIG_PATH_INFO_VER2;
            pathInfo[i].sourceModeInfo = 0;
            pathInfo[i].reserved = 0;
        }

        status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);

        if (status == NVAPI_OK) {
            for (int i = 0; i < deviceCount; i++)
            {
                pathInfo[i].sourceModeInfo = new NV_DISPLAYCONFIG_SOURCE_MODE_INFO_V1;
                pathInfo[i].sourceModeInfo->reserved = 0;
                pathInfo[i].targetInfo = new NV_DISPLAYCONFIG_PATH_TARGET_INFO_V2[pathInfo[i].targetInfoCount];
                for (int j = 0; j < pathInfo[i].targetInfoCount; j++) {
                    pathInfo[i].targetInfo[j].details = 0;
                }
            }
        }

        status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);

        for (int i = 0; i < deviceCount; i++)
        {
            if (pathInfo[i].sourceModeInfo) delete pathInfo[i].sourceModeInfo;
            if (pathInfo[i].targetInfo) delete [] pathInfo[i].targetInfo;
        }
        delete[] pathInfo;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-10-02 19:03:17

马科斯的回答更彻底。我认为,代码中的具体问题是没有初始化第二个pathInfo。因此,您需要添加:

代码语言:javascript
复制
configinfos[1].version = NV_DISPLAYCONFIG_PATH_INFO_VER;

这也是一个很好的形式,总是使你的记忆无效。因此,在分配之后,您应该立即这样做:

代码语言:javascript
复制
memset(configinfos, 0, sizeof(NV_DISPLAYCONFIG_PATH_INFO) * count);

或者您可以单独设置值。

票数 0
EN

Stack Overflow用户

发布于 2014-08-14 07:22:18

在示例代码中有一个名为DisplayConfiguration的示例,它与NvAPI一起提供,它完全利用了GetDisplayConfig。从DisplayConfiguration.cpp复制粘贴函数:

代码语言:javascript
复制
NvAPI_Status AllocateAndGetDisplayConfig(NvU32* pathInfoCount, NV_DISPLAYCONFIG_PATH_INFO** pPathInfo)
{
    NvAPI_Status ret;

    // Retrieve the display path information
    NvU32 pathCount                         = 0;
    NV_DISPLAYCONFIG_PATH_INFO *pathInfo    = NULL;

    ret = NvAPI_DISP_GetDisplayConfig(&pathCount, NULL);
    if (ret != NVAPI_OK)    return ret;

    pathInfo = (NV_DISPLAYCONFIG_PATH_INFO*) malloc(pathCount * sizeof(NV_DISPLAYCONFIG_PATH_INFO));
    if (!pathInfo)
    {
        return NVAPI_OUT_OF_MEMORY;
    }

    memset(pathInfo, 0, pathCount * sizeof(NV_DISPLAYCONFIG_PATH_INFO));
    for (NvU32 i = 0; i < pathCount; i++)
    {
        pathInfo[i].version = NV_DISPLAYCONFIG_PATH_INFO_VER;
    }

    // Retrieve the targetInfo counts
    ret = NvAPI_DISP_GetDisplayConfig(&pathCount, pathInfo);
    if (ret != NVAPI_OK)
    {
        return ret;
    }

    for (NvU32 i = 0; i < pathCount; i++)
    {
        // Allocate the source mode info
        pathInfo[i].sourceModeInfo = (NV_DISPLAYCONFIG_SOURCE_MODE_INFO*) malloc(sizeof(NV_DISPLAYCONFIG_SOURCE_MODE_INFO));
        if (pathInfo[i].sourceModeInfo == NULL)
        {
            return NVAPI_OUT_OF_MEMORY;
        }
        memset(pathInfo[i].sourceModeInfo, 0, sizeof(NV_DISPLAYCONFIG_SOURCE_MODE_INFO));

        // Allocate the target array
        pathInfo[i].targetInfo = (NV_DISPLAYCONFIG_PATH_TARGET_INFO*) malloc(pathInfo[i].targetInfoCount * sizeof(NV_DISPLAYCONFIG_PATH_TARGET_INFO));
        if (pathInfo[i].targetInfo == NULL)
        {
            return NVAPI_OUT_OF_MEMORY;
        }
        // Allocate the target details
        memset(pathInfo[i].targetInfo, 0, pathInfo[i].targetInfoCount * sizeof(NV_DISPLAYCONFIG_PATH_TARGET_INFO));
        for (NvU32 j = 0 ; j < pathInfo[i].targetInfoCount ; j++)
        {
            pathInfo[i].targetInfo[j].details = (NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO*) malloc(sizeof(NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO));    
            memset(pathInfo[i].targetInfo[j].details, 0, sizeof(NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO));
            pathInfo[i].targetInfo[j].details->version = NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO_VER;
        }
    }

    // Retrieve the full path info
    ret = NvAPI_DISP_GetDisplayConfig(&pathCount, pathInfo);
    if (ret != NVAPI_OK)    
    {
        return ret;
    }

    *pathInfoCount = pathCount;
    *pPathInfo = pathInfo;
    return NVAPI_OK;
}

现在这个函数可以很容易地使用,就像:

代码语言:javascript
复制
NV_DISPLAYCONFIG_PATH_INFO *pathInfo = NULL;
NvU32 pathCount = 0;
_allocateAndGetDisplayConfig(&pathCount, &pathInfo);
// Do whatever you need with the queried display data here
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10737051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档