![]() |
Re: Pointer & Co
Hi,
hab jetzt folgendes gemacht:
Delphi-Quellcode:
Wobei das scheint nicht zu stimmen, die einzige zahl die ich wiedererkenne währ numoftemps wobei diese so bei numofvolts eingetragen ist.
procedure TForm1.Button2Click(Sender: TObject);
var hSFMemory: HWND; SfAreaPtr: Pointer ; MyResultRecord: TMyRecord; i: Integer; txt: String; begin fillchar(buffer,1000,0); hSFMemory := 0; SfAreaPtr := nil; i := 0; 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(buffer),SfAreaPtr,1000); MyResultRecord.Unknown:= buffer[0]; MyResultRecord.NumTemps:= buffer[1]; MyResultRecord.NumFans:= buffer[2]; MyResultRecord.NumVolts:= buffer[3]; MyResultRecord.Temps:= buffer[4]; MyResultRecord.Fans:= buffer[5]; MyResultRecord.Volts:= buffer[6]; end; finally UnmapViewOfFile(SfAreaPtr); CloseHandle(hSFMemory); end; end; Was macht dieser VB Code? oder was ist der gedanke dabei?: Zitat:
|
Re: Pointer & Co
Dein Record stimmt doch noch gar nicht :
Delphi-Quellcode:
Probier mal so
Private Type SF_Raw_MemMap
Unknown(5) As Integer 'unbekanntes Tag NumTemps As Integer 'Anzahl der Temperaturen NumFans As Integer 'Anzahl der Lüfter NumVolts As Integer 'Anzahl der Spannungen Temps(63) As Integer 'Werte der Temperaturen Fans(63) As Integer 'Drehzahl der Lüfter Volts(63) As Integer 'Werte der Spannungen End Type
Delphi-Quellcode:
TSF_Raw_MemMap = Packet Record
Unknown : Array[0..5] of Integer //unbekanntes Tag NumTemps : Integer //Anzahl der Temperaturen NumFans : Integer //Anzahl der Lüfter NumVolts : Integer //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; |
Re: Pointer & Co
Ah das is ein array in VB wenn eine klammer mit zahl angegeben wird..... dachte mir schon das die Zahlen für was sind, hab aber nicht geschnallt wofür. Hab das ja ettliche beiträge vorher schonmal geschrieben. Dank dir =D
|
Re: Pointer & Co
Die Array-Grenzen stimmen noch nicht :oops:
(5) ist 0..4 bzw 63 ist 0..62 laut ![]() Edit : Da sind sich die Leute nicht einig : ![]() Nach dem lesen der beiden Seiten : Die Arraygrenzen stimmen doch, die Zahl in der Klammer gibt den höchsten Index an und der Startindex ist normalerweise 0 wenn kein Option Base 1 angegeben ist |
Re: Pointer & Co
Naja, hilft aber auch nicht weiter wenn da nicht mehr daten stehen oder?
![]() ![]() PS: ich hab den buffer rausgeschmissen und versucht die daten gleich in den Record zu schreiben: CopyMemory(Addr(MyResultRecord),SfAreaPtr,1000); Sollte so doch auch stimmen, gibt mir ja die selben werte zurück nur bereits in die record struktur angepasst was meiner meinung nach ja unser ziel ist oder? |
Re: Pointer & Co
fillchar(buffer,1000,0); // Dein Buffer ist gar nicht so groß
RetVal.Temps = mMyArea.NumTemps RetVal.Volts = mMyArea.NumVolts RetVal.Fans = mMyArea.NumFans For x = 0 To 32 Step 2 RetVal.Temp(x / 2) = mMyArea.Temps(x) / 100 RetVal.Fan(x / 2) = mMyArea.Fans(x) RetVal.Volt(x / 2) = mMyArea.Volts(x) / 100 Next ist eine VB -Schleife, die die Integer aus den einzelnen Feldern in Floats umrechnet, wobei die Schrittweite 2 ist, also nur 16 Werte übertägt |
Re: Pointer & Co
Ist ein buffer immer wie ein Array aufgebaut?
Trozdem kommt nicht mehr als das hier: ![]() ![]() oberes bild ist mit:
Delphi-Quellcode:
aber direkt so scheint auch zu gehen:
CopyMemory(Addr(Buffer),SfAreaPtr,1000);
Delphi-Quellcode:
)
CopyMemory(Addr(MyResultRecord),SfAreaPtr,1000);
Was das erste bild zustande bringt, da hab ich den Buffer garnicht erst verwedet. Aber irgendwie scheine ich nicht alle daten zu kriegen ?? PS: wie kann ich z.b. die lenge von myResultRecord herausfinden? denn dann währe folgendes möglich:
Delphi-Quellcode:
Ich gehe ja davon aus das der record der form der Daten die ich zurückbekomme entsprechen sollte...
CopyMemory(Addr(MyResultRecord),SfAreaPtr,length(MyResultRecord));
|
Re: Pointer & Co
Hallo Gibb,
im Prinzip liegst Du schon richtig aber 1)Dein MyresultRecord muß ein packed record sein 2) statt Length solltest du Sizeof verwenden, das gibt Dir die Größe in Bytes zurück. z.B.
Delphi-Quellcode:
Gruß
a1 : array [0..3] of integer;
length(a1) >> 4 { 4 Integer} sizeof(A1) >> 16 {16 Bytes } K-H Edit: Tippfehler |
Re: Pointer & Co
1: isses doch:
Delphi-Quellcode:
Also scheint beim Copy was nicht ganz zu stimmen :-( oder sonstwo
TMyRecord = packed record
public Unknown : Array[0..5] of Integer; //unbekanntes Tag NumTemps : Integer; //Anzahl der Temperaturen NumFans : Integer; //Anzahl der Lüfter NumVolts : Integer; //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; 2: danke das hab ich gesucht XD wusste nur nicht wie die funktion heisst ^-^' war mir schon klar das length nicht geht, aber du hast es verstanden ;) EDIT: Habs jetzt so:
Delphi-Quellcode:
EDIT2:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
Was könnt hier nicht stimmen?
Delphi-Quellcode:
Das stimmt schon mit Addr von MyResultRecord oder?
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)); CopyMemory nimmt ja nur Pointers folglich geb ich ihm den Pointer zu meinem Record. :-/ |
Re: Pointer & Co
Also ich seh da jetzt keine Fehler, aber wie wäre es zb mit so etwas
Delphi-Quellcode:
und dann schau Dir mal den Inhalt von pMyRecord^ und MyResultRecord an, da sollte eigentlich das gleiche stehen.
Type
pMyrecord:=^TMyrecord; .... SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0); pMyrecord:=SfAreaPtr; CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord)); (ich hatte die Record Definition übersehen) Gruß K-H |
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