Laden...

Grafikkartentemperatur mit nvcpl.dll auf 64 Bit System auslesen

Erstellt von dahaack vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.244 Views
D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren
Grafikkartentemperatur mit nvcpl.dll auf 64 Bit System auslesen

Hallo liebe Gemeinde,

ich möchte für meinen Grafikkartenlüfter (NVIDIA Grafikkarte) eine Regelung programmieren.

Ich scheitere leider dabei die Temperatur der Grafikkarte auszulesen.

Nach einiger googelei fand ich heraus, dass eine Datei "nvcpl.dll" eingebunden werden muss.

Auf meinem Computer habe ich mehrere dieser Dateien gefunden, ich habe die genommen, welche im Windows/System32 Ordner vorhanden ist und in mein Projekt kopiert.

Google gibt bei verschiedenen Suchergebnissen übereinstimmend etwa folgenden Code aus:

private class NativeMethod
        {
            [DllImport("C:\\Windows\\System32\\nvcpl.dll", EntryPoint = "NvCplGetThermalSettings", CallingConvention = CallingConvention.Cdecl)]
            public static extern bool NvCplGetThermalSettings(int nWindowsMonitor, out int pdwCoreTemp, out int pdwAmbientTemp, out int pdwUpperLimit);
        }
        public void getTemperature()
        {
            if (NativeMethod.NvCplGetThermalSettings(1, out kern, out außen, out max))
            {

                dataGridView1[2, 0].Value = kern.GetTypeCode(); // Print temperature in datagridview
            }
            else
            {
                // Fehler
            }
        }

Nun habe ich die Möglichkeit in den Projektoptionen als Zielplattfrm "x86", "x64"oder "Any CPU" einzustellen. (Auf meinem Computer läuft Windows 7 64 Bit)

Wähle ich als Zielplattform x86 so stürzt das Programm ab: > Fehlermeldung:

Es wurde versucht, eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)

Stelle ich die Zielplattform auf Any CPU oder x64, so stürzt das Programm zwar nicht ab, allerdings erhalte ich auch keine Temperatur, weil die Methode

NativeMethod.NvCplGetThermalSettings(1, out kern, out außen, out max)

false zurückgibt, was bedeutet, dass ein Fehler aufgetreten ist.

Leider findet man aber auch in der Beschreibung der DLL keinerlei Infos über die Ursache des Fehlers. http://developer.download.nvidia.com/SDK/9.5/Samples/DEMOS/common/src/NvCpl/docs/NVControlPanel_API.pdf (Seite 64)

Auch bei google habe ich nichts gefunden. Hat jemand vielleicht einen Tipp für mich?

Danke!

N
135 Beiträge seit 2006
vor 11 Jahren

Evtl. benötigt die DLL weitere Programmteile. Versuche doch mal direkt auf die DLL im System32 zu verweisen

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo dahaack,

ich tippe auf das Gleiche wie Neidhard, das kannst du mit einem Tool wie http://www.dependencywalker.com/ prüfen.

Siehe auch Forumssuche nach nvcpl dll

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren

Hallo,

danke für eure Antworten!

Wenn ich auf die Datei direkt verweise, kommt die Fehlermeldung > Fehlermeldung:

Es konnte kein Verweis auf "nvcpl.dll" hinzugefügt werden. Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass sie eine gültige Assenbly oder COM-Komponente ist.

Die Lösung des Problems soll eben die Variante sein, die ich gewählt habe. *.dll Funktioniert nicht?

Wenn ich die Datei mit Dependency Walker öffne, so, gibt das Programm aus, dass die Datei IESHIMS.DLL nicht gefunden wurde.

Diese ist in der Aufrufhierarchie ind NVCPL.DLL => SHELL32.DLL => SHDOCVW.DLL => IEFRAME.DLL => IESHIMS.DLL

Wenn ich nach dieser Datei auf meinem Computer suche, habe ich wieder mehrere Suchergebnisse. Ich habe eine dieser Dateien in den System32 Ordner kopiert (wo er diese Datei vermisst hat) und die DLL neu geöffnet. Nun kommt die Fehlermeldung > Fehlermeldung:

Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

Wenn ich es richtig einschätze dürfte ich eine nicht passende IESHIMS.DLL kopiert haben. Ist das richtig?

Das C# Programm gibt immer noch einen Fehler in der Funktion zurück.

D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren

Es kann doch nicht sein, dass es so schwierig ist rauszufinden, wie man die Temperatur der Grafikkarte ausliest.

Ich habe es auch mit WMI probiert:

WqlObjectQuery wqlQuery =
            new WqlObjectQuery("SELECT * FROM Win32_TemperatureProbe");
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(wqlQuery);
            dataGridView1.Rows.Clear();
            int i = 0;
            foreach (ManagementObject disk in searcher.Get())
            {
                dataGridView1.Rows.Add();
                dataGridView1[1, i].Value = (disk.ToString());
                i++;
            }

Die Abfrage gibt keine Temperatur zurück. Dass das Programm "funktioniert", sehe ich daran, dass meine Laufwerke angezeigt werden, wenn ich Win32_TemperatureProbe mit Win32_LogicalDisk austausche.

Vielleicht hat ja doch noch jemand eine Idee? Dass es möglich sein muss, sehe ich an dem Programm Everest. Dort wird die Temperatur der Grafikkarte angezeigt.

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo dahaack,

eine Idee hab ich schon und zwar dass du dir NVIDIA GPU Temp – Sidebar Gadget anschaust bzw. wie es dort gemacht wurde.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren

Hallo gfoidl,

danke für die Antwort. Damit werd' ich's bestimmt schaffen.