AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer & Co

Ein Thema von gibb · begonnen am 3. Mär 2010 · letzter Beitrag vom 16. Mär 2010
Antwort Antwort
Seite 3 von 4     123 4      
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#21

Re: Pointer & Co

  Alt 5. Mär 2010, 09:24
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
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#22

Re: Pointer & Co

  Alt 5. Mär 2010, 09:31
Wenn du folgende Deklaration benutzt, kommt was plausibles raus :
Delphi-Quellcode:
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;
NumTemps : 3
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
Glückauf
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#23

Re: Pointer & Co

  Alt 5. Mär 2010, 10:27
Hier noch eine etwas ausführlichere Deklaration:
Delphi-Quellcode:
  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;
Packet Record

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.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#24

Re: Pointer & Co

  Alt 5. Mär 2010, 13:54
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:
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.
Gruss Gibb

PS: Ja ich weiss sollte nicht mit div arbeiten aber war gerade zu faul das alles vom int umzuwandeln.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#25

Re: Pointer & Co

  Alt 8. Mär 2010, 13:10
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:
procedure TForm1.Button2Click(Sender: TObject);
var
  SpeedFanReader : TReadSpeedfan;
begin
  SpeedFanReader.Create;

  Speedfanreader.ReadSFData;

  SpeedFanReader.free;

 sleep(1);

end;
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?

Gruss Sev
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#26

Re: Pointer & Co

  Alt 8. Mär 2010, 13:28
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;
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#27

Re: Pointer & Co

  Alt 11. Mär 2010, 17:53
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 )
http://www.abload.de/image.php?img=s...reader30v8.png
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
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#28

Re: Pointer & Co

  Alt 12. Mär 2010, 12:11
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
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#29

Re: Pointer & Co

  Alt 12. Mär 2010, 12:34
Delphi-Quellcode:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
FintData:= MyResultRecord;
Result:= True;
Warum nicht :
Delphi-Quellcode:
CopyMemory(Addr(FintData),SfAreaPtr,sizeof(MyResultRecord));
Result:= True;
If UpdateData = False then Result:= False; Boolsche Werte nie auf True oder False abfragen : http://www.delphi-treff.de/tutorials...oolean-werten/
Besser :
If Not UpdateData then Result:= False; bzw an der Stelle kannst du gleich schreiben
Result := UpdateData
Glückauf
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#30

Re: Pointer & Co

  Alt 12. Mär 2010, 12:59
was mich sowieso auf einen Fehler gebracht hat

Delphi-Quellcode:
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;
was aber schlussendlich dasselbe resultat zurückliefert

EDIT:

Wieso die Volts nicht stimmen konnten lag daran:
Delphi-Quellcode:
    For i:= 0 to FIntData.NumVolts -1 do begin
      FstrData.Volts.Add('Voltage'+inttostr(i)+':'+FormatFloat('###,##', fintData.Volts[i]/100));
    end;
hatte da FormatFloat('###,##', fintData.Temp[i]/100)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz