AGB  ·  Datenschutz  ·  Impressum  







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

C-Code übersetzen

Ein Thema von tn249 · begonnen am 22. Jun 2005 · letzter Beitrag vom 23. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#1

C-Code übersetzen

  Alt 22. Jun 2005, 22:02
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#2

Re: C-Code übersetzen

  Alt 22. Jun 2005, 22:07
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
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: C-Code übersetzen

  Alt 22. Jun 2005, 22:20
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#4

Re: C-Code übersetzen

  Alt 22. Jun 2005, 22:43
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#5

Re: C-Code übersetzen

  Alt 22. Jun 2005, 22:50
hmm... klappt bei mir per Copy&Paste einwandfrei. Egal ob mit ullAvailExtendedVirtual oder ohne.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: C-Code übersetzen

  Alt 22. Jun 2005, 22:58
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#7

Re: C-Code übersetzen

  Alt 22. Jun 2005, 23:01
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.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: C-Code übersetzen

  Alt 22. Jun 2005, 23:05
Zitat von Christian Seehase:
ich hab's mal so gemacht
Rate mal warum die Struktur ein dwLength hat

Wenn etwas nicht funktioniert: Rückgabewert prüfen und GetLastError auswerten...
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#9

Re: C-Code übersetzen

  Alt 22. Jun 2005, 23:09
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;
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#10

Re: C-Code übersetzen

  Alt 22. Jun 2005, 23:55
Zitat von NicoDE:
Zitat von Christian Seehase:
ich hab's mal so gemacht
Rate mal warum die Struktur ein dwLength hat

Wenn etwas nicht funktioniert: Rückgabewert prüfen und GetLastError auswerten...
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 )
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:40 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