![]() |
C-Code übersetzen
Hallo,
ich würde gerne folgende Struktur und Funktion in Delphi verwenden;
Code:
der code stammt aus der winbase.h
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 ); 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 |
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 ![]() PS: DWORDLONG habe ich noch nicht drin, da bleibt aber kommt aber wohl nur Int64 in Frage. PPS: Zum konkreten Fall: ![]() |
Re: C-Code übersetzen
Delphi-Quellcode:
Das sollte es in etwa sein, ich gehe aber von 2-3 Fehlern aus, also besser nochmal jemanden ranlassen, der sich auskennt.
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; Doofer roter kasten! ich sehe gerade, da gibts ja schon was. meine vermutungen gingen aber wenigstens in die richtige richtung. |
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 |
Re: C-Code übersetzen
hmm... klappt bei mir per Copy&Paste einwandfrei. Egal ob mit ullAvailExtendedVirtual oder ohne.
|
Re: C-Code übersetzen
Moin Zusammen,
ich hab's mal so gemacht:
Delphi-Quellcode:
und erhalte, als Fehlermeldung, Falscher Parameter.
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; Der Aufruf schlägt also fehl. Windows XP Pro SP2 |
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.
|
Re: C-Code übersetzen
Zitat:
Wenn etwas nicht funktioniert: Rückgabewert prüfen und GetLastError auswerten... |
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; |
Re: C-Code übersetzen
Zitat:
Zitat:
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. |
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