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;