Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Pointer & Co (https://www.delphipraxis.net/148518-pointer-co.html)

gibb 4. Mär 2010 13:41

Re: Pointer & Co
 
Hi,

hab jetzt folgendes gemacht:
Delphi-Quellcode:
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;
Wobei das scheint nicht zu stimmen, die einzige zahl die ich wiedererkenne währ numoftemps wobei diese so bei numofvolts eingetragen ist.

Was macht dieser VB Code? oder was ist der gedanke dabei?:
Zitat:

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
gruss gibb

guinnes 4. Mär 2010 13:56

Re: Pointer & Co
 
Dein Record stimmt doch noch gar nicht :
Delphi-Quellcode:
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
Probier mal so
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;

gibb 4. Mär 2010 14:01

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

guinnes 4. Mär 2010 14:05

Re: Pointer & Co
 
Die Array-Grenzen stimmen noch nicht :oops:
(5) ist 0..4 bzw 63 ist 0..62 laut http://www.vbarchiv.net/faq/strings_array.php
Edit : Da sind sich die Leute nicht einig : http://de.wikibooks.org/wiki/Visual_Basic_6:_Arrays
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

gibb 4. Mär 2010 14:20

Re: Pointer & Co
 
Naja, hilft aber auch nicht weiter wenn da nicht mehr daten stehen oder?

http://www.abload.de/thumb/inspectorecos.jpg

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?

guinnes 4. Mär 2010 15:15

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

gibb 4. Mär 2010 15:53

Re: Pointer & Co
 
Ist ein buffer immer wie ein Array aufgebaut?

Trozdem kommt nicht mehr als das hier:
http://www.abload.de/thumb/buffer156t.jpg

oberes bild ist mit:
Delphi-Quellcode:
CopyMemory(Addr(Buffer),SfAreaPtr,1000);
aber direkt so scheint auch zu gehen:
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:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,length(MyResultRecord));
Ich gehe ja davon aus das der record der form der Daten die ich zurückbekomme entsprechen sollte...

p80286 4. Mär 2010 16:00

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:
  a1 : array [0..3] of integer;

length(a1) >> 4  { 4 Integer}
sizeof(A1) >> 16 {16 Bytes }
Gruß
K-H

Edit: Tippfehler

gibb 4. Mär 2010 16:12

Re: Pointer & Co
 
1: isses doch:
Delphi-Quellcode:
  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;
Also scheint beim Copy was nicht ganz zu stimmen :-( oder sonstwo

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:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
EDIT2:
Was könnt hier nicht stimmen?

Delphi-Quellcode:
    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));
Das stimmt schon mit Addr von MyResultRecord oder?

CopyMemory nimmt ja nur Pointers folglich geb ich ihm den Pointer zu meinem Record. :-/

p80286 4. Mär 2010 16:49

Re: Pointer & Co
 
Also ich seh da jetzt keine Fehler, aber wie wäre es zb mit so etwas
Delphi-Quellcode:
Type
  pMyrecord:=^TMyrecord;

....
 
  SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0);
  pMyrecord:=SfAreaPtr;
  CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
und dann schau Dir mal den Inhalt von pMyRecord^ und MyResultRecord an, da sollte eigentlich das gleiche stehen.

(ich hatte die Record Definition übersehen)

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 2 von 4     12 34      

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