Hallo,
ich habe folgendes Problem:
Ich würde gerne auf meinem LCD die Temperatur meiner Grafikkarte ausgeben lassen. Leider kann
Speedfan diese nicht auslesen und ich sie so auch nicht in
LCDHype über das Speedfan-Plugin anzeigen lassen.
Also habe ich mich ein wenig auf die Suche gemacht und habe herausgefunden, dass man den Nvidia-Treiber direkt anzapfen kann (
nvcpl.dll API).
Also wollte ich mir ein eingenes Plugin schreiben, dass mir die GraKa-Temperatur ausliest und an LCDHype zurückgibt. Im Grunde ist es nur ein einziger DLL-Aufruf:
nvcpl.dll - Api
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.
Für LCDHype gibt es ein Plugin-SDK für Delphi (
hier). Ich habe dieses bereits erfolgreich genutzt, um mir ein Plugin zu schreiben, dass mir den Titel des Winampfensters per Winapi ausliest.
Nur den DLL-Aufruf bekomme ich einfach nicht hin. Ich muss dazu sagen, dass ich mit Delphi bis jetzt eigentlich noch nichts gemacht habe. Gut ich habe in der Schule mal ein wenig Turbo Pascal machen müssen (ist ja fast die gleiche Syntax) und vor einiger Zeit mal nen bischen mit rumgespielt, mehr aber auch nicht.
Ich habe mir schon verschiedene Tutorials und Hilfen angesehen, aber irgendwie will das mit dem Aufruf nicht klappen. bzw. der kompiliert das ganz normal, der Aufruf des Plugins in LCDHype schlägt dann aber leider fehl.
So sehen die entsprechenden Bereiche bis jetzt aus:
unter
interface hab ich mit eingefügt:
|
Source code
|
1
|
function NvCplGetThermalSettings(nWindowsMonitorNumber: UINT; pdwCoreTemp, pdwAmbientTemp, pdwUpperLimit: DWORD ): BOOL; CDECL;
|
dann direkt unter
implements (gut da kommt noch ein "uses math")
|
Source code
|
1
|
function NvCplGetThermalSettings(nWindowsMonitorNumber: UINT; pdwCoreTemp, pdwAmbientTemp, pdwUpperLimit: DWORD ): BOOL; CDECL; external 'nvcpl.dll';
|
und der direkte Aufruf in der Funktion ist dann folgendes:
|
Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
function GetData(parameter : pchar) : TData;
var return : string;
c : integer;
x : TData;
pdwCoreTemp, pdwAmbientTemp, pdwUpperLimit: DWORD;
begin
FillChar(x.data,sizeof(x.data),EOL);
return := ''; //return will hold the data returned by plugin
pdwCoreTemp := 0;
pdwAmbientTemp := 0;
pdwUpperLimit := 0;
//der aufruf sollte nach SDK true oder false zurückliefern
if NvCplGetThermalSettings(0, pdwCoreTemp, pdwAmbientTemp, pdwUpperLimit) then
Str(pdwCoreTemp, return) //die Zahl in einen String konvertieren
else return := '!';
//##############
//folgendes ist aus dem PluginSDK übernommen
//##############
//Enclose returned string with " to avoid losing spaces
//LCDHype will erase all spaces when not enclosed with "
return := '"'+return+'"';
for c:=0 to length(return)-1 do
x.data[c] := ord(return[c+1]);
result := x;
end;
|
Um die Fragen vorwegzunehmen:
1) Die dll kann sonst normal angesprochen werden, mit einem anderen Tool([URL=http://www.amilo-forum.de/topic,3974,-Nvidia-GPU-Temperaturanzeige-im-Tray.html]nvtmp[/URL] ), dass den gleichen Aufruf nutzt, funktioniert das ohne Probleme.
2) Das Plugin an sich funktioniert sonst auch, denn wie oben schon gesagt, nutze ich das auch um mir den Winamp-Fenstertitel auszulesen.
3) Ja die Grafikkarte hat einen Temp-Sensor, da die Temperatur erstens im Treiber angezeigt wird und zweitens auch 1) die Temperatur anzeigt
Kann mir da wer weiterhelfen bzw sieht den Fehler im Code?
Wäre super!
oixio
PS: Wer den ganzen Code sehen will: alles was ich nicht gepostet hab, steht im SDK drin. Einzige Änderung: habe die Funktion "GetDataEx" nicht mir exportiert, die wird von LCDHype sonst als erstes abgefragt. Mir reicht aber die "GetData".