2013-06-10 8 views
0

NvAPI_DISP_GetDisplayConfig 함수를 사용하여 (다른 스레드에서 설명한 것처럼) 세 번 연속으로 디스플레이 구성을 성공적으로 관리 할 수 ​​있었고 이제는 내 디스플레이 중 하나의 배율 옵션을 변경하려고합니다.C++에서 NvAPI_DISP_SetDisplayConfig 함수를 사용하는 방법은 무엇입니까?

그러나 설정을 변경하지 않거나 스케일링 옵션을 변경하지 않고 단순히 검색된 pathInfo를 다시 적용하려고해도 NvAPI_DISP_SetDisplayConfig는 실패합니다. 누군가가 왜 그런 생각을 가지고 있습니까? 어떤 도움을 크게 apreciated 될

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)) { 

    printf("\nFirst pass ok. \n"); 
    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) { 

     printf("\nSecond pass ok. \n"); 
     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 = new NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO_V1; 
          pathInfo[i].targetInfo[j].details->version = NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO_VER1; 
       pathInfo[i].targetInfo[j].details->reserved = 0; 
      } 
     } 
    } 

    status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo); 
    if (status == NVAPI_OK) { 
      printf("\nThird pass ok. \n"); 
    } 

     for (int i = 0; i < deviceCount; i++) 
     { 
      for (int j = 0; j < pathInfo[i].targetInfoCount; j++) { 
       switch(pathInfo[i].targetInfo[j].details->scaling) 
       { 
       case NV_SCALING_DEFAULT: 
        printf("Default"); 
        break; 
       case NV_SCALING_GPU_SCALING_TO_CLOSEST: 
        printf("GPU Scaling to closest"); 
        break; 
       case NV_SCALING_GPU_SCALING_TO_NATIVE : 
        printf("GPU scaling to native"); 
        break; 
       case NV_SCALING_GPU_SCANOUT_TO_NATIVE : 
        printf("Gpu scanout to native"); 
        break; 
       case NV_SCALING_GPU_SCALING_TO_ASPECT_SCANOUT_TO_NATIVE : 
        printf("GPU scaling to aspect scanout to native"); 
        break; 
       case NV_SCALING_GPU_SCALING_TO_ASPECT_SCANOUT_TO_CLOSEST : 
        printf("Gpu scaling to aspect scanout to closest"); 
        break; 
       case NV_SCALING_GPU_SCANOUT_TO_CLOSEST : 
        printf("Gpu scanout to closest"); 
        break; 
       case NV_SCALING_CUSTOMIZED : 
        printf("Scaling customized"); 
       default: 
        printf("Nothing"); 
        break; 
       }    
      }  
     } 

    //FAILS !!!!!!!!!! 
     status = NvAPI_DISP_SetDisplayConfig(deviceCount,pathInfo,NV_DISPLAYCONFIG_VALIDATE_ONLY ); 
    } 

}, 대단히 감사합니다!

답변

0

당신은 당신이 특정 오류를 줄 수 ... 그것은 무슨 잘못을 정확하게 알고있는 문제를 해결하는 데 도움이 될 수 있습니다 ... SetDisplayConfig 실패 언급하는 것 예를 들어, 다음은 NVAPI programming documentation에서 가져온 것입니다 :

/* 
This function is used to print to the command line a text message 
describing the nvapi error and quits 
*/ 
void PrintError(NvAPI_Status status) 
{ 
    NvAPI_ShortString 
    szDesc = {0}; 
    NvAPI_GetErrorMessage 
    (status, szDesc); 
    printf(" NVAPI error: %s\n", szDesc); 
    exit(-1); 
} 
+0

누군가이 문제를 해결하는 데 도움이되는지 확신 할 수 없지만이 코드를 실행할 수 있었고 SetDisplayConfig 행에서 충돌했습니다. 디버깅 할 때 충돌로 인해 특정 주소에서 액세스 위반이 발생했습니다. 이 주소는 PathInfo의 NV 개체 중 하나에서 pOSAdapter 주소와 일치하는 것으로 보입니다. – efel

0

IsNonNVIDIAAdapter이 true로 설정 되었기 때문에 pOSAdapterID이 전달되지 않습니다. nVidia 그래픽 카드를 가지고 있다면 사용하기 전에 pathInfo에 ZeroMemory()을 입력하십시오.