Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

1

Saturday, March 11th 2006, 3:13pm

Externe DLL aufrufen in Delphi?

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:

Quoted

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".
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

RedKen

Trainee

  • "RedKen" is male

Posts: 105

Date of registration: Nov 15th 2004

Location: Hannover Rock-City

2

Saturday, March 11th 2006, 3:38pm

RE: Externe DLL aufrufen in Delphi?

Ich hab mal in meinen alten Delphi-Codes nachgesehen und festgestellt, dass du nur den Teil im Interface brauchst, allerdings mit dem external Aufruf . Eine weitere Definition im Implements-Teil ist dann nicht nötig, denn implementiert ist die Funktion ja in der dll. Hoffe das hilft.
ich sitz' am Puls der Zeit und schneid' und schneid' und schneid'...

This post has been edited 2 times, last edit by "RedKen" (Mar 11th 2006, 3:40pm)


oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

3

Saturday, March 11th 2006, 3:54pm

RE: Externe DLL aufrufen in Delphi?

@RedKen
So hatte ich das in ein zwei Tutorials auch schon mal gesehen und ausprobiert. Ich habs eben vorsichtshalber noch mal getestet und es funktioniert trotzdem nicht :(

Trotzdem danke für deine Mühe!
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

RedKen

Trainee

  • "RedKen" is male

Posts: 105

Date of registration: Nov 15th 2004

Location: Hannover Rock-City

4

Saturday, March 11th 2006, 4:29pm

RE: Externe DLL aufrufen in Delphi?

Schade.
Hast du es mal mit stdcall statt cdecl versucht?
ich sitz' am Puls der Zeit und schneid' und schneid' und schneid'...

This post has been edited 1 times, last edit by "RedKen" (Mar 11th 2006, 4:32pm)


oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

5

Saturday, March 11th 2006, 5:12pm

RE: Externe DLL aufrufen in Delphi?

Quoted

Original von RedKen
Hast du es mal mit stdcall statt cdecl versucht?


Ja. Leider ohne Erfolg.


Edit:
Ich habs jetzt noch mal in ein Testprojekt ausgelagert und anhand der Fehlermeldungen schnell eine mögliche Ursache gefunden: Pointer :D
da sollte man evtl drauf achten. Ich teste das gleich mal....

Edit 2: Jo, das wars.
@RedKen, danke für deine Bemühungen, manchmal hilfts einfach darüber zu reden und es nochmal zu überdenken....
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

This post has been edited 2 times, last edit by "oixio" (Mar 11th 2006, 5:41pm)