Einzelnen Beitrag anzeigen

ggoetzen

Registriert seit: 2. Jul 2007
1 Beiträge
 
#1

Ein Array von Char-Pointern einer DLL übergeben (.net)

  Alt 2. Jul 2007, 10:57
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:
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
Meine Übersetzung lautet ungefähr:
(oben)
Delphi-Quellcode:
  KMStringArray = array of string;
  KMByteArray = array of longint;
dann...
Delphi-Quellcode:
   [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;
Benutzt wird die Funktion dann hier:
Delphi-Quellcode:
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;
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!?).

Vielen Dank
Gerrit Götzen
  Mit Zitat antworten Zitat