Thema: Delphi GetProcessIoCounters

Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#2

Re: GetProcessIoCounters

  Alt 5. Feb 2004, 22:58
Hallo Nachaz,

zunächst einmal herzlich willkommen bei der Delphi-PRAXiS!


Wenn ich Deinen Code richtig interpretiere, ist zunächst einmal die Aufrufkonvention Deiner Implementierung mit
Function(hProc : THandle; var IoCounters : PIoCounters) : BOOL; nicht ganz Stimmig: Hier sollte die Konvention stdcall verwendet werden und nicht die Delphi-Default Konvention (register).
Darüber hinaus ist die Signatur der Funktion nicht korrekt übersetzt: Bei einem CallByReference (var) wird bereits ein Pointer auf die Tatsächliche Struktur übergeben. Die beiden Signaturen
procedure ARoutine(var AnInt: Integer); und
procedure ARoutine(AnInt: PInteger); sind im Hinblick auf den erzeugten Code identisch. Mit Deiner Signatur
procedure ARoutine(var Something: PioCounters) übergibst Du folglich eine Referenz (einen Pointer) auf einen Pointer...
Typischerweise werden solche Funktionen bei der Übersetzung mit der CallByReference-Variante unter Beibehaltung der Hungerian-Notation in Delphi umgesetzt, also
procedure ARoutine(var lpIoCounters: TIoCounters) Wenn Du das umsetzt, ergibt sich der andere gravierende Fehler Deiner Implementierung (die Übergabe eines Pointers, der bisher nicht initialisiert wurde) von selbst...

Ich bin zwar kein Experte bei Header-Übersetzungen, aber ich habe einmal versucht, die Umsetzung gemäß der Unit Windows für die Funktion GetProcessIoCounters umzusetzen. Hierbei verwende ich jedoch, im Gegensatz zu Deinem Ansatz, keine dynamische Bindung:

Delphi-Quellcode:
type
  _IO_COUNTERS = record
    ReadOperationCount : LONGLONG;
    WriteOperationCount : LONGLONG;
    OtherOperationCount : LONGLONG;
    ReadTransferCount : LONGLONG;
    WriteTransferCount : LONGLONG;
    OtherTransferCount : LONGLONG;
  end;
  TIoCounters = _IO_COUNTERS;

function GetProcessIoCounters(hProcess: THandle;
  var lpIoCounters: TIoCounters): BOOL; stdcall external kernel32;
Aufgerufen werden kann die Funktion dann (ohne irgendwelche Pointer) in der Form
Delphi-Quellcode:
var
  myCounters: TIoCounters;
begin
  if GetProcessIoCounters(GetCurrentProcess, myCounters) then
    DoLog(myCounters)
  else
    DoLogError;
gruß, choose
  Mit Zitat antworten Zitat