typedef enum
{
NVAPI_THERMAL_TARGET_NONE = 0,
NVAPI_THERMAL_TARGET_GPU = 1,
NVAPI_THERMAL_TARGET_MEMORY = 2,
NVAPI_THERMAL_TARGET_POWER_SUPPLY = 4,
NVAPI_THERMAL_TARGET_BOARD = 8,
NVAPI_THERMAL_TARGET_VCD_BOARD = 9,
NVAPI_THERMAL_TARGET_VCD_INLET = 10,
NVAPI_THERMAL_TARGET_VCD_OUTLET = 11,
NVAPI_THERMAL_TARGET_ALL = 15,
NVAPI_THERMAL_TARGET_UNKNOWN = -1,
} NV_THERMAL_TARGET;
typedef struct
{
int version;
int count;
struct
{
int controller;
int defaultMinTemp;
int defaultMaxTemp;
int currentTemp;
NV_THERMAL_TARGET target;
} sensor[3];
} NV_GPU_THERMAL_SETTINGS;
typedef void *(*NVQueryInterface)(unsigned int offset);
typedef int (*NVInitialize)();
typedef int (*NVEnumPhysicalGPUs)(int **handles, int *count);
typedef int (*NVGetThermalSettings)(int *handle, int sensorIndex, NV_GPU_THERMAL_SETTINGS *temp);
NVQueryInterface nvQueryInterface;
NVInitialize nvInitialize;
NVEnumPhysicalGPUs nvEnumPhysicalGPUs;
NVGetThermalSettings nvGetThermalSettings;
HMODULE hNvDll = NULL;
int gpuCount = 0;
int *gpuHandles[64] = {NULL};
NV_GPU_THERMAL_SETTINGS nvgts;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hNvDll = LoadLibraryA("nvapi.dll");
if (hNvDll == NULL)
{
ShowMessage("Couldn't find nvidia dll");
return;
}
// Interface delegtion...
nvQueryInterface = (NVQueryInterface)GetProcAddress(hNvDll, "nvapi_QueryInterface");
nvInitialize = (NVInitialize)nvQueryInterface(0x0150E828);
nvEnumPhysicalGPUs = (NVEnumPhysicalGPUs)nvQueryInterface(0xE5AC921F);
nvGetThermalSettings = (NVGetThermalSettings)nvQueryInterface(0xE3640A56);
if (nvInitialize == NULL || nvEnumPhysicalGPUs == NULL ||
nvEnumPhysicalGPUs == NULL )
{
ShowMessage("Couldn't get functions in nvidia dll");
FreeLibrary(hNvDll);
hNvDll = NULL;
return;
}
nvInitialize();
nvEnumPhysicalGPUs(gpuHandles, &gpuCount);
nvgts.version = sizeof(NV_GPU_THERMAL_SETTINGS) | (1<<16);
nvgts.count = 0;
nvgts.sensor[0].controller = -1;
nvgts.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int gpuTemp;
if(hNvDll != NULL)
{
nvGetThermalSettings(gpuHandles[0], 0 ,&nvgts);
String s;
s.printf(L"GPU 현재온도 = %d\n", nvgts.sensor[0].currentTemp);
Caption = s;
}
}
답변:
지난 답변에서 nvapi.dll .. nvapi_QueryInterface() 을 이용한다고 답변했었는데...
예전에 답변한 C# 코드 참고해서 포팅하세요. 이만 휴가...
|