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 );
}
}, 대단히 감사합니다!
누군가이 문제를 해결하는 데 도움이되는지 확신 할 수 없지만이 코드를 실행할 수 있었고 SetDisplayConfig 행에서 충돌했습니다. 디버깅 할 때 충돌로 인해 특정 주소에서 액세스 위반이 발생했습니다. 이 주소는 PathInfo의 NV 개체 중 하나에서 pOSAdapter 주소와 일치하는 것으로 보입니다. – efel