Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi C-Code übersetzen (https://www.delphipraxis.net/48254-c-code-uebersetzen.html)

tn249 22. Jun 2005 22:02


C-Code übersetzen
 
Hallo,

ich würde gerne folgende Struktur und Funktion in Delphi verwenden;

Code:
typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORDLONG ullTotalPhys;
    DWORDLONG ullAvailPhys;
    DWORDLONG ullTotalPageFile;
    DWORDLONG ullAvailPageFile;
    DWORDLONG ullTotalVirtual;
    DWORDLONG ullAvailVirtual;
    DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

WINBASEAPI
BOOL
WINAPI
GlobalMemoryStatusEx(
    __out LPMEMORYSTATUSEX lpBuffer
    );
der code stammt aus der winbase.h


nun habe ich gelesen, dass man solchen C-Code erst übersetzen muss, um ihn verwenden zu können, hab aber keine Ahnung wie
1. das reine Übersetzen des Quellcodes und nach welchen Regeln funktioniert
2. wie ich das Übersetzte in das Delphi-Projekt einbinde (eigene Unit, oder irgendwie anders?)

Vielen Dank für eure Hilfe
Thomas

scp 22. Jun 2005 22:07

Re: C-Code übersetzen
 
Wenn der Code übersetzt ist, kannst du ihn ganz normal in dein Projekt reinsetzen, es ist ja dann Pascal-Code.
Habe mal hier ein paar simple Beispiele und Tabellen mit Typen usw. hinterlegt.

PS: DWORDLONG habe ich noch nicht drin, da bleibt aber kommt aber wohl nur Int64 in Frage.

PPS: Zum konkreten Fall: Das hier

DGL-luke 22. Jun 2005 22:20

Re: C-Code übersetzen
 
Delphi-Quellcode:
 type _MEMORYSTATUSEX = record
  dwlength, dwMemoryload: integer;
  ullTotalPhys,
  ullAvailPhys,
  ullTotalPageFile,
  ullAvailPageFile,
  ullTotalVirtual,
  ullAvailVirtual,
  ullAvailExtendedVirtual: Int64; //longword = Int64 ?! ansonsten ein anderer großer integer-typ.
 end;
 LPMEMORYSTATUSEX = ^_MEMORYSTATUSEX; // hier bin ich mir nicht sicher, bzw. das ist nur geraten

//hier schient eine Funktion, die ein boolean zurückgibt, deklariert zu werden.
{
WINBASEAPI //keine ahnung was das heisst
BOOL      //das scheint der rückgabetyp zu sein
WINAPI    //siehe eins weiter oben
GlobalMemoryStatusEx( //scheint obiges ratespiel zu bestätigen.
    __out LPMEMORYSTATUSEX lpBuffer
    );
}

function GlobalMemoryStatusEx(var lpBuffer: LPMEMORYSTATUSEX):boolean;
Das sollte es in etwa sein, ich gehe aber von 2-3 Fehlern aus, also besser nochmal jemanden ranlassen, der sich auskennt.

Doofer roter kasten! ich sehe gerade, da gibts ja schon was. meine vermutungen gingen aber wenigstens in die richtige richtung.

tn249 22. Jun 2005 22:43

Re: C-Code übersetzen
 
Es funktioniert noch nicht ganz, bzw eher gar fast gar nicht

bei NicoDE's Version kann ich ohne Fehler kompilieren, bekomme aber in alle Werte 0, ausserdem habe ich festgestellt, dass der Wert "DWORDLONG ullAvailExtendedVirtual;" fehlt, ich habe ihn versucht nach dem muster einzubauen, aber auch da bekomme ich 0 für alle Werte


@DGL-luke: der Compiler meckert bei deiner Funktionsdeklaration;
unsatisfied forward decleration

Werde morgen mal auf Fehlersuchen gehen

Danke soweit und gute Nacht
Thomas

scp 22. Jun 2005 22:50

Re: C-Code übersetzen
 
hmm... klappt bei mir per Copy&Paste einwandfrei. Egal ob mit ullAvailExtendedVirtual oder ohne.

Christian Seehase 22. Jun 2005 22:58

Re: C-Code übersetzen
 
Moin Zusammen,

ich hab's mal so gemacht:

Delphi-Quellcode:
type
  DWORDLONG      = int64;
  _MEMORYSTATUSEX = packed record
    dwLength               : DWORD;
    dwMemoryLoad           : DWORD;
    ullTotalPhys           : DWORDLONG;
    ullAvailPhys           : DWORDLONG ;
    ullTotalPageFile       : DWORDLONG;
    ullAvailPageFile       : DWORDLONG;
    ullTotalVirtual        : DWORDLONG;
    ullAvailVirtual        : DWORDLONG;
    ullAvailExtendedVirtual : DWORDLONG;
  end;
  MEMORYSTATUSEX  = _MEMORYSTATUSEX;
  LPMEMORYSTATUSEX = ^_MEMORYSTATUSEX;

function GlobalMemoryStatusEx(const ApMemoryStatusEx : LPMEMORYSTATUSEX) : LongBool; stdcall; external 'kernel32.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  pmse : LPMEMORYSTATUSEX;

begin
  pmse := AllocMem(SizeOf(_MEMORYSTATUSEX));
  try
    if not GlobalMemoryStatusEx(pmse) then begin
      ShowMessage(SysErrorMessage(GetLastError));
    end;
  finally
    FreeMem(pmse,SizeOf(_MEMORYSTATUSEX));
  end;
end;
und erhalte, als Fehlermeldung, Falscher Parameter.
Der Aufruf schlägt also fehl.
Windows XP Pro SP2

scp 22. Jun 2005 23:01

Re: C-Code übersetzen
 
Guck dir am besten den Code von Nico an, der weiter oben von mir verlinkt ist, da ist auch ein Beispiel für den Aufruf.

NicoDE 22. Jun 2005 23:05

Re: C-Code übersetzen
 
Zitat:

Zitat von Christian Seehase
ich hab's mal so gemacht

Rate mal warum die Struktur ein dwLength hat :D

Wenn etwas nicht funktioniert: Rückgabewert prüfen und GetLastError auswerten...

scp 22. Jun 2005 23:09

Re: C-Code übersetzen
 
Ach ja, das Beispiel war ja ohne Ex, hier mit:
Delphi-Quellcode:
var Status: TMemoryStatusEx;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillChar(Status, SizeOf(Status), 0);
  Status.dwLength := SizeOf(Status);

  GlobalMemoryStatusEx(Status); //Werte zuweisen

  Memo1.Clear;
  Memo1.Alignment := tARightJustify;
  Memo1.Lines.Add('RAM gesamt: ' + IntToStr(Status.ullTotalPhys) + ' Bytes');
  Memo1.Lines.Add('RAM verfügbar: ' + IntToStr(Status.ullAvailPhys) + ' Bytes');
  Memo1.Lines.Add('Virtuell gesamt: ' + IntToStr(Status.ullTotalVirtual) + ' Bytes');
  Memo1.Lines.Add('Virtuell verfügbar: ' + IntToStr(Status.ullAvailVirtual) + ' Bytes');
end;

tn249 22. Jun 2005 23:55

Re: C-Code übersetzen
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Christian Seehase
ich hab's mal so gemacht

Rate mal warum die Struktur ein dwLength hat :D

Wenn etwas nicht funktioniert: Rückgabewert prüfen und GetLastError auswerten...

Zitat:

Zitat von PSDK - Definition MEMORYSTATUS
dwLength
Size of the MEMORYSTATUS data structure, in bytes. You do not need to set this member before calling the GlobalMemoryStatus function; the function sets it.

Blöd bloß das das nicht bei MEMORYSTATUSEX funktioniert. und ich dachte das wäre "abwärtskompatibel"

jetzt bekomm ich auch werte ungleich 0 auf den record - bis auf den letzten wert, der bleibt null. könnte aber auch daran liegen das er wirklich null ist, nunja, die anderen werte stimmen wenigstens mit denen von GlobalMemoryStatus überein

MfG
Thomas (der doch nicht ins Bett gegangen ist :roll: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
Seite 1 von 2  1 2      

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