사용하고 있는 PC에는 그래픽카드가 2개입니다.
하나는 내장그래픽으로 인텔이구요.
나머지 하나는 nvidia GeForce GTX 560 SE입니다.
모니터는 당연히 560SE에 꼽혀있구요.
OS는 Windows7 64Bit구요.
그래픽카드 온도를 측정하기 위해 다음과 같은 소스코드를 구글링하여 퍼왔습니다.
function NvidiaGpuTemp: Integer;
type
NvCplGetThermalSettings = function(
nWindowsMonitorNumber: UINT;
pdwCoreTemp,
pdwAmbientTemp, pdwUpperlimit: PDWORD): BOOL; cdecl;
var
hNvcpl: Hwnd;
GetThermalSettings: NvCplGetThermalSettings;
dwCoreTemp, dwAmbientTemp, dwUpperlimit: DWORD;
begin
Result := 0;
hNvcpl := LoadLibrary('nvcpl.dll');
if hNvcpl <> 0 then
try
GetThermalSettings := GetProcAddress(hNvcpl,'NvCplGetThermalSettings');
if Assigned(GetThermalSettings) then
If GetThermalSettings(0, Addr(dwCoreTemp), Addr(dwAmbientTemp),
Addr(dwUpperlimit)) then
begin
Result:= Integer(dwCoreTemp);
end;
finally
FreeLibrary(hNvcpl);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(InttoStr(NvidiaGpuTemp));
end;
그리고 nvcpl.dll은 그래픽카드 드라이버를 설치하면
C:\Windows\System32 폴더 안에 nvcpl.dll파일이 생성되어 그것을 사용하였습니다.
하지만 위 코드를 실행하면
hNvcpl := LoadLibrary('nvcpl.dll');
이 부분에서 에러가 발생합니다.
그래서 네이버에서 검색하여 어느 블로그에 올려진 64비트용 nvcpl.dll을 구하여 사용해 봤습니다.
이러자 이번엔
GetThermalSettings(0, Addr(dwCoreTemp), Addr(dwAmbientTemp), Addr(dwUpperlimit))
여기서 False가 반환됩니다.
GPU-Z.exe에서는 이상없이 그래픽카드 온도를 가져오는데
제 코드는 뭐가 잘못된건가요?
뭐가 잘못된 건가요?
참고로 NVidia에서 제공하고 메뉴얼에는 다음과 같이 나와 있습니다.
NvCplGetThermalSettings
Function
Prototype
BOOL CDECL NvCplGetThermalSettings
(IN UINT nWindowsMonitorNumber,
OUT DWORD* pdwCoreTemp,
OUT DWORD* pdwAmbientTemp,
OUT DWORD* pdwUpperLimit);
Parameters In UINT nWindowsMonitorNumber -- The display number shown on
the Windows Display Properties->Settings page.
A value of 0 indicates the current primary Windows display device.
DWORD* must be a valid pointer --
pdwCoreTemp -- GPU temperature in degrees Celsius.
pdwAmbientTemp -- Ambient temperature in degrees Celsius.
pdwUpperLimit -- Upper limit of the GPU temperature specification.
Return Values True on success.
False on failure.