Einzelnen Beitrag anzeigen

CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#1

Unicode-Probleme beim Auflisten von RAS-Verbindungen (RasGetEntryProperties)

  Alt 5. Dez 2013, 12:47
Ich möchte gerne, die lokalen RAS-Verbindungen auflisten. Dazu habe ich mir mit Hilfe der RAS-API-Header von Jedi etwas zusammengebastelt (aufs Nötigste gekürzt):
Delphi-Quellcode:
var
  ListRasEntryName: array of TRasEntryName;
  Err, SizeRasEntryName, NumEntries: DWORD;
  i : Integer;
begin
  List.Clear;
  SetLength(ListRasEntryName, 1);
  SizeRasEntryName := SizeOf(TRasEntryName);
  ListRasEntryName[0].dwSize := SizeRasEntryName;

  Err := RasEnumEntries(nil, nil, @ListRasEntryName[0], SizeRasEntryName, NumEntries);
  if (Err = ERROR_BUFFER_TOO_SMALL) and (NumEntries > 0) then
  begin
    SetLength(ListRasEntryName, NumEntries);
    Err := RasEnumEntries(nil, nil, @ListRasEntryName[0], SizeRasEntryName, NumEntries);
    if Err = 0 then
      for i := 0 to Length(ListRasEntryName) do
        List.Add(ListRasEntryName[i].szEntryName);
  end;
end;
Das funktioniert auch prima, solange in den Verbindungsnamen keine Unicode-Zeichen auftauchen. Bei Unicode-Zeichen wird ein "?" ausgespuckt, was in der Folge zu Problemen führt.
Erster Gedanke war natürlich, die Unicode-Pendants zu verwenden: TRasEntryNameW und RasEnumEntriesW.
Aber damit bekomme ich leider nur Kauderwelsch raus. Nun weiß ich nicht, ob ich dafür noch mehr anpassen müsste oder ob vielleicht ein Fehler in den Header-Übersetzungen vorliegt.

Wenn ich die Info-Datei richtig deute, sind die Header von 2000, also weit vor Delphi-Unicode-Zeit. Eine Änderung musste ich manuell machen, damit es zumindest als Ansi-Version funktioniert (s.u.). Das könnte die Vermutung stützen, dass noch irgendetwas anderes an den Headern falsch ist und zum Unicode-Problem führt.
Delphi-Quellcode:
function RasGetEntryPropertiesA(lpszPhonebook: PAnsiChar; lpszEntry: PAnsiChar;
  lpRasEntry: PRasEntryA; var lpdwEntryInfoSize: DWORD;
  lpbDeviceInfo: Pointer; lpdwDeviceInfoSize: PDWORD): DWORD; stdcall;
{$EXTERNALSYM RasGetEntryPropertiesA}
function RasGetEntryPropertiesW(lpszPhonebook: PWideChar; lpszEntry: PWideChar;
  lpRasEntry: PRasEntryW; var lpdwEntryInfoSize: DWORD;
  lpbDeviceInfo: Pointer; lpdwDeviceInfoSize: PDWORD): DWORD; stdcall;
{$EXTERNALSYM RasGetEntryPropertiesW}
function RasGetEntryProperties(lpszPhonebook: PChar; lpszEntry: PAnsiChar; //Original: PChar
  lpRasEntry: PRasEntry; var lpdwEntryInfoSize: DWORD;
  lpbDeviceInfo: Pointer; lpdwDeviceInfoSize: PDWORD): DWORD; stdcall;
{$EXTERNALSYM RasGetEntryProperties}

[...]

function RasGetEntryPropertiesA; external raslib name 'RasGetEntryPropertiesA';
function RasGetEntryPropertiesW; external raslib name 'RasGetEntryPropertiesW';
function RasGetEntryProperties; external raslib name 'RasGetEntryPropertiesA';
Hat jemand eine Idee, wie sich das Problem lösen lässt?
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat