![]() |
Ein Array von Char-Pointern einer DLL übergeben (.net)
Hallo zusammen,
leider habe ich ein Problem, dass ganz vielen Threads hier ähnelt, ich aber dennoch nicht lösen konnte. Ich habe eine DLL und entsprechende Header für C und Basic. Diesen habe ich nun einigermaßen übersetzt. Es gibt da aber eine Funktion, die mir eine Liste mit Namen etc zurückgeben soll. Hier die Beschreibungen aus C und Basic:
Code:
KMErrorCode EXPORTFCN KMTCPGetDeviceInformation(char *lpszNameArray[], char *lpszAddressArray[], char *lpszSNArray[], UINT16 DIPArray[], int nNumDevices );
Code:
Meine Übersetzung lautet ungefähr:
Declare Function KMTCPGetDeviceInformation Lib "KMAPI32.DLL" (ByVal lpszNameArray As Long, ByVal lpszAddressArray As Long, ByVal lpszSNArray As Long, ByVal DIPArray As Long, ByVal nNumDevices As Long) As Long
(oben)
Delphi-Quellcode:
dann...
KMStringArray = array of string;
KMByteArray = array of longint;
Delphi-Quellcode:
Benutzt wird die Funktion dann hier:
[DllImport('KMAPI32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
function KMTCPGetDeviceInformation(var lpszNameArray: KMStringArray; var lpszAddressArray: KMStringArray; var lpszSNArray: KMStringArray; var DIPArray: KMByteArray; nNumDevices: longint):longint; external;
Delphi-Quellcode:
Das mag Teilweise etwas komisch aussehen, habe ich mir aber aus diversen Foren und Dokus rausgesucht. Ich bekomm aber immer einen Fehler "Unbehandelte Exception bei @($0,$0,$0). Exception-Klasse System.NullReferenceException mit Meldung 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.'. Prozess AR6560.exe (1068)". Oder das Array ist leer (ich habe schon alles Mögliche probiert). Jetzt weiß ich nicht mehr weiter. Wichtig ist noch .Net! Also keine Pointer (oder habe ich das falsch verstanden!?).
procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);
var num: smallint; names: KMStringArray; serials: KMStringArray; ips: KMStringArray; dips: KMByteArray; I: Integer; begin DeviceList.Items.Clear; DeviceList.Items.Add('suche...'); err := KMTCPRefreshDevices(); err := KMTCPGetNumDevices(num); if num < 1 then begin DeviceList.Items.Clear; DeviceList.Items.Add('kein Gerät gefunden'); end else begin SetLength(names, num); SetLength(serials, num); SetLength(ips, num); SetLength(dips, num); for I := 0 to num - 1 do begin names[I] := ' '; serials[I] := ' '; ips[I] := ' '; end; err := KMTCPGetDeviceInformation( names, ips, serials, dips, num); deviceList.items.clear(); for I := 0 to num - 1 do begin deviceList.items.Add(names[I]+' | '+serials[I]+' | '+ips[I]+' | '+dips[I].ToString); end; end; end; Vielen Dank Gerrit Götzen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz