![]() |
Re: Pointer & Co
Macht leider keinen Unterschied. :-( hab ich dann einfach die daten falsch strukturiert zurückgenommen?
Oder was muss ich Zaubern damit es stimmt ? Was vielleicht interessant sein dürfte ist das ich weder die volt angaben hab oder die fan angaben hier auf der HP kiste.(das einzige was ich hab sind 3 temps) aber das sollte doch dennoch stimmen im memory... sonst würde doch speedfan selber auch nicht funktionieren. Gruss Gibb |
Re: Pointer & Co
Wenn du folgende Deklaration benutzt, kommt was plausibles raus :
Delphi-Quellcode:
NumTemps : 3
TSF_Raw_MemMap = Packet Record
Unknown : Array[0..5] of SmallInt//unbekanntes Tag NumTemps : SmallInt //Anzahl der Temperaturen NumFans : SmallInt //Anzahl der Lüfter NumVolts : SmallInt //Anzahl der Spannungen Temps : Array[0..63] of Integer //Werte der Temperaturen Fans : Array[0..63] of Integer //Drehzahl der Lüfter Volts : Array[0..63] of Integer //Werte der Spannungen end; NumFans : 0 NumVolts : 0 Temps[0] = 3300 ( / 100 = 33°) Temps[1] = 2700 ( / 100 = 27°) Temps[2] = 2600 ( / 100 = 26°) Die Zahlen, die als Integer bei dir angezeigt werden als Hex : 01 00 01 00 92 01 00 00 5c 06 03 00 03 00 00 00 00 00 e4 0c 00 00 8c 0a 00 00 28 0A Als SmallInt : 01 00 = 1 01 00 = 1 92 01 = 402 00 00 = 0 5c 06 = 1628 03 00 = 3 03 00 = 3 00 00 = 0 00 00 = 0 Rest als Integer : e4 0c 00 00 = 3300 8c 0a 00 00 = 2700 28 0A 00 00 = 2600 Edit : Ich hab hier auch ne HP-Kiste stehen, die hat auch fast nix an Sensoren |
Re: Pointer & Co
Hier noch eine etwas ausführlichere Deklaration:
Delphi-Quellcode:
Packet Record :wink:
TSharedMem = packed record
Version : Word; {2 Byte} Flags : Word; {2 Byte} MemSize : Integer; {4 Byte} Handle : THandle; {4 Byte} NumTemps : Word; {2 Byte} NumFans : Word; {2 Byte} NumVolts : Word; {2 Byte} Value : array[0..0] of Integer; end; Edit: Ob tatsächlich statisch 64 oder 32 Einträge für Temps usw. vorgesehen sind oder die Anzahl der Werte dynamisch und die Zuordnung zu Temp, Fan und Volt sich entsprechend verschiebt, ist zumindest mir nicht klar. |
Re: Pointer & Co
Hallo zusammen,
Danke vielmals ich jetzt funktionierts, (ist noch nicht ganz ausgereift der Code, aber so funktionieren die Grundlegenden sachen... wollte diesen auch mit der öffentlichkeit teilen ;))
Delphi-Quellcode:
Gruss Gibb
unit Main;
interface uses Windows, SysUtils, Classes, Forms, Controls, StdCtrls; type TMyRecord = Packed Record Unknown : Array[0..5] of SmallInt;//unbekanntes Tag NumTemps : SmallInt; //Anzahl der Temperaturen NumFans : SmallInt; //Anzahl der Lüfter NumVolts : SmallInt; //Anzahl der Spannungen Temps : Array[0..63] of Integer; //Werte der Temperaturen Fans : Array[0..63] of Integer; //Drehzahl der Lüfter Volts : Array[0..63] of Integer; //Werte der Spannungen end; TForm1 = class(TForm) Memo1: TMemo; Button2: TButton; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const mbuff = 1000; var Form1: TForm1; buffer : array [0..mbuff] of integer; myrecord : tmyrecord absolute buffer; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); var hSFMemory: HWND; SfAreaPtr: Pointer ; MyResultRecord: TMyRecord; i: Integer; begin fillchar(buffer,1000,0); hSFMemory := 0; SfAreaPtr := nil; try hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM'); if HSFMemory <> 0 then begin SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0); CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord)); memo1.Text:= memo1.Text+'Number Of Temps:'+inttostr(MyResultRecord.NumTemps)+#13+#10; memo1.Text:= memo1.Text+'Number Of Fans:'+inttostr(MyResultRecord.NumFans)+#13+#10; memo1.Text:= memo1.Text+'Number Of Volts:'+inttostr(MyResultRecord.NumVolts)+#13+#10; For i:= 0 to MyResultRecord.NumFans -1 do begin MyResultRecord.Fans[i]:= MyResultRecord.Fans[i]div 100; memo1.Text:= memo1.Text+'Fan'+inttostr(i)+':'+inttostr(MyResultRecord.Fans[i])+#13+#10; end; For i:= 0 to MyResultRecord.numTemps -1 do begin MyResultRecord.Temps[i]:= MyResultRecord.Temps[i]div 100; memo1.Text:= memo1.Text+'Temp'+inttostr(i)+':'+inttostr(MyResultRecord.Temps[i])+#13+#10; end; For i:= 0 to MyResultRecord.NumVolts -1 do begin MyResultRecord.Volts[i]:= MyResultRecord.Volts[i]div 100; memo1.Text:= memo1.Text+'Fan'+inttostr(i)+':'+inttostr(MyResultRecord.Volts[i])+#13+#10; end end; finally UnmapViewOfFile(SfAreaPtr); CloseHandle(hSFMemory); end; end; end. PS: Ja ich weiss sollte nicht mit div arbeiten ;) aber war gerade zu faul das alles vom int umzuwandeln. |
Re: Pointer & Co
hallo Zusammen,
Ich hab jetzt das hier in eine eigene unit ausgelagert:
Delphi-Quellcode:
unit ReadSpeedfanData;
interface uses Windows, SysUtils, Classes, Forms, Controls, StdCtrls, Dialogs, messages; type TResultIntRecord = Packed Record Unknown : Array[0..5] of SmallInt;//unbekanntes Tag NumTemps : SmallInt; //Anzahl der Temperaturen NumFans : SmallInt; //Anzahl der Lüfter NumVolts : SmallInt; //Anzahl der Spannungen Temps : Array[0..63] of Integer; //Werte der Temperaturen Fans : Array[0..63] of Integer; //Drehzahl der Lüfter Volts : Array[0..63] of Integer; //Werte der Spannungen end; TResultStrRecord = Record NumTemps : SmallInt; //Anzahl der Temperaturen NumFans : SmallInt; //Anzahl der Lüfter NumVolts : SmallInt; //Anzahl der Spannungen Temps : TStringList; //Werte der Temperaturen Fans : TStringList; //Drehzahl der Lüfter Volts : TStringList; //Werte der Spannungen End; TReadSpeedfan = Class(TObject) Private FIntData : TResultIntRecord; FstrData: TResultStrRecord; Function UpdateData: Boolean; Public Function ReadSFData: Boolean; Function GetstrResult: TResultStrRecord; End; implementation Function TReadSpeedfan.ReadSFData: Boolean; var hSFMemory: HWND; SfAreaPtr: Pointer ; MyResultRecord: TResultIntRecord; begin hSFMemory := 0; SfAreaPtr := nil; try hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM'); if HSFMemory <> 0 then begin SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0); CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord)); FintData:= MyResultRecord; Result:= True; If UpdateData = False then Result:= False; end else begin Result := False; end; finally UnmapViewOfFile(SfAreaPtr); CloseHandle(hSFMemory); end; end; Function TReadSpeedFan.UpdateData: Boolean; var i: Integer; Temp : Single; PiAsStr: String; Begin Try If not Assigned(FstrData.Temps) then FstrData.Temps:= TStringlist.Create; If not Assigned(FstrData.Fans) then FstrData.Fans:= TStringlist.Create; If not Assigned(FstrData.Volts) then FstrData.Volts:= TStringlist.Create; FstrData.Temps.Clear; FstrData.Fans.Clear; FstrData.Volts.Clear; For i:= 0 to FIntData.NumFans -1 do begin FstrData.Fans.Add('Fan'+inttostr(i)+':'+IntTostr(FIntData.Fans[i])); end; For i:= 0 to FIntData.NumTemps -1 do begin FstrData.Fans.Add('Temp'+inttostr(i)+':'+FormatFloat('###,##', fintData.Temps[i]/100)); end; For i:= 0 to FIntData.NumVolts -1 do begin FstrData.Fans.Add('Voltage'+inttostr(i)+':'+FormatFloat('###,##', fintData.Temps[i]/100)); end; FstrData.NumTemps:= FIntData.NumTemps; FstrData.NumFans:= FIntData.NumFans; FstrData.NumVolts:= FIntData.NumVolts; Result:= True; except Result:= False; End; End; Function TReadSpeedfan.GetstrResult (): TResultStrRecord; var MyResultRecord: TResultStrRecord; i: Integer; begin Result := FstrData; end; end. Und ruffe es aus dem Main auf:
Delphi-Quellcode:
Sobald er aber die Funktion abschliessen möchte kommen exceptions. Ich nehme an das es irgendwie an dem Copymemory befehl und nicht freigegeben speicehr resp. bereits freigegeben Speicher liegt. Hat da jemand ne ahnung was genau das problem ist?
procedure TForm1.Button2Click(Sender: TObject);
var SpeedFanReader : TReadSpeedfan; begin SpeedFanReader.Create; Speedfanreader.ReadSFData; SpeedFanReader.free; sleep(1); end; Gruss Sev |
Re: Pointer & Co
Ach du meine güte -.- mann sollte wissen wie man ein objekt erzeugt -.-'
Sorry, Lösung fürs problem (und ich hab ca ne stunde dafür verbraten -.-):
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var SpeedFanReader : TReadSpeedfan; begin SpeedFanReader:= TReadSpeedfan.create; //SpeedFanReader.Create; <- alt war so -.- Speedfanreader.ReadSFData; SpeedFanReader.free; sleep(1); end; |
Re: Pointer & Co
hi,
irgendwas stimmt da noch nicht :-( Laut VB code werden die Return werte durch 100 geteilt bis auf die fans. Das hier sind jetzt die werte die ich kriege ohne zu teilen (bis auf die temps natürlich die sind bereits durch 100 ) ![]() stimmt in diesem fall etwas am array nicht? Komisch ist auch das er mir sagt er hätte 9 numofvolts aber danach doch nur 6 werte dafür hat. Gruss Sev |
Re: Pointer & Co
niemand eine Idee? Lese ich die werte falsch aus? Stimmt der datentyp nicht? beim vb code versteh ich auch nicht wieso der ein Step2 drinnen hat. Bei mir kommt schön brav immer eine Zahl nach der anderen, wenn ich nen step 2 reintun würde würde ich die hälfte der werten verlieren.
Gruss Sev |
Re: Pointer & Co
Delphi-Quellcode:
Warum nicht :
CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
FintData:= MyResultRecord; Result:= True;
Delphi-Quellcode:
CopyMemory(Addr(FintData),SfAreaPtr,sizeof(MyResultRecord));
Result:= True;
Delphi-Quellcode:
Boolsche Werte nie auf True oder False abfragen :
If UpdateData = False then Result:= False;
![]() Besser :
Delphi-Quellcode:
bzw an der Stelle kannst du gleich schreiben
If Not UpdateData then Result:= False;
Delphi-Quellcode:
Result := UpdateData
|
Re: Pointer & Co
was mich sowieso auf einen Fehler gebracht hat ;)
Delphi-Quellcode:
was aber schlussendlich dasselbe resultat zurückliefert ;)
Function TReadSpeedfan.ReadSFData: Boolean;
var hSFMemory: HWND; SfAreaPtr: Pointer ; MyResultRecord: TResultIntRecord; begin result:= False; hSFMemory := 0; SfAreaPtr := nil; try hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM'); if HSFMemory <> 0 then begin SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0); CopyMemory(Addr(FintData),SfAreaPtr,sizeof(MyResultRecord)); result:= UpdateData; end; finally UnmapViewOfFile(SfAreaPtr); CloseHandle(hSFMemory); end; end; EDIT: Wieso die Volts nicht stimmen konnten lag daran:
Delphi-Quellcode:
hatte da FormatFloat('###,##', fintData.Temp[i]/100)
For i:= 0 to FIntData.NumVolts -1 do begin
FstrData.Volts.Add('Voltage'+inttostr(i)+':'+FormatFloat('###,##', fintData.Volts[i]/100)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz