Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Rückgabe-Pointer PUTF8String aus DLL in String umwandeln?

  Alt 17. Jan 2020, 20:13
So einfach kann ich kein Beispiel-Projekt generieren, weil ich...blablabla
Komisch, dass hat mich jetzt nur 10 Minuten gekostet.
Eine SDL2.dll habe ich in meiner Steam-Installation gefunden und verwendet.

Anhand deines Quelltext-Schnipsels und den sehr anschaulichen Konsolenprogramm von Friedhelm kam ich auf das:

Delphi-Quellcode:
uses
  System.SysUtils,
  System.Classes;

const
  SDL_INIT_AUDIO = $00000010;

  DEVICE_TYPE_OUTPUT = 0;

  SDL_LIB = 'SDL2.dll';

function SDL_Init(flags: Integer): Integer; cdecl; external SDL_LIB;
function SDL_GetNumAudioDevices(isCapture: Integer): Integer; cdecl; external SDL_LIB;
function SDL_GetAudioDeviceName(index: Integer; isCapture: Integer): PAnsiChar; cdecl; external SDL_LIB;

procedure TestGetAudioDeviceName;
var
  pDeviceName: PAnsiChar;
  deviceName: string;
  deviceNameList: TStringList;
  count, i: Integer;
begin
  SDL_Init(SDL_INIT_AUDIO);
  count := SDL_GetNumAudioDevices(0);
  deviceNameList := TStringList.Create();
  try
    for i := 0 to count - 1 do
    begin
      pDeviceName := SDL_GetAudioDeviceName(i, 0);
      deviceName := UTF8ToString(pDeviceName);
      deviceNameList.Add(deviceName);
    end;
  finally
    deviceNameList.Free;
  end;
end;
Das ergibt dann in der Stringliste auf meinen Windows 10 System:
Zitat:
Kopfhörer (2- Microsoft LifeChat LX-3000)
PL2495W (NVIDIA High Definition Audio)
Realtek Digital Output (Realtek High Definition Audio)
Bringe mal deine Variablentypen in Ordnung (PAnsiChar/PUTF8String anstatt PChar, verwende den Index der Schleife für SDL_GetAudioDeviceName anstatt immer 0 reinzugeben und lasse auf jedem Fall das dereferenzieren des Rückgabewertes. Also das hier pDeviceName^ -> Nicht machen!
Das hat bei mir in Delphi Rio schon gar nicht kompiliert wegen:
Code:
[dcc32 Error] SDLDemo.dpr(34): E2251 Ambiguous overloaded call to 'UTF8ToString'
  System.pas(39750): Related method: function UTF8ToString(const array of AnsiChar): string;
  System.pas(39740): Related method: function UTF8ToString(const ShortString): string;


Zitat:
Nur läuft...nicht unter MacOS-64
Verwendest du denn auch die SDL2.dylib für Mac OS X anstatt den Windows-Build mit SDL2.dll?
Man beachte die Dateiendung.
  Mit Zitat antworten Zitat