Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rückgabe-Pointer PUTF8String aus DLL in String umwandeln? (https://www.delphipraxis.net/203135-rueckgabe-pointer-putf8string-aus-dll-string-umwandeln.html)

TiGü 17. Jan 2020 20:13

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

Zitat von philipp.hofmann (Beitrag 1455442)
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.

philipp.hofmann 17. Jan 2020 22:13

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

Bringe mal deine Variablentypen in Ordnung
-> das sind nicht meine Variablentypen, sondern die von FlashAVConverter, da ich deren FFMPEG-Player verwende.

Mein Fehler war hier, dass ich versucht habe, über deren sdl.pas-Implementierung das Problem zu lösen.
Eine so wie in deinem Beispiel extrem abgespeckte Implementierung ist zielführender, ich brauche in meinem Fall sogar nicht zu initialisieren, dies passiert ja im FlashAVConverter schon und dann kann ich die korrekten Variablentypen nutzen. Daher vielen Dank für das Beispiel, damit kommen bei mir jetzt auch valide Werte raus.

Das Problem mit MacOS war, dass das SDL2.pas-Beispiel nicht MacOS-64-fähig war, d.h. da waren teilweise Integer-Werte nicht miteinander kompatibel. Das ist in dem hier abgespeckten Beispiel jetzt aber natürlich auch kein Problem.

Das Beispiel von Friedhelm hatte ich bei meinem Kommentar von 17:25 noch gar nicht gesehen, mein Fehler. Meine Info bezog sich noch auf den vorletzten Kommentar.

Vielen Dank allen für die Hilfe. Jetzt wird der nächste Spaß noch die Kollegen von FlashAVConverter zu überzeugen, dass man auch während eine Datei abgespielt wird, man den Output-Kanal wechseln möchte. Das scheint dort noch nicht so ganz zu gehen. Aber das wird auch noch.

himitsu 20. Jan 2020 11:08

AW: Rückgabe-Pointer PUTF8String aus DLL in String umwandeln?
 
Bei Allem außer Windows gibt es leider keinen AnsiString mehr (nicht direkt), was eine geräteübergreifende Lösung auf neuere Wege führt. (die ganzen Stream-Funktionen um TEncoding und Co.)


PS: Delphi nimmt bei PAnsiChar natürlich ANSI als Standardkodierung an,
was man bei direkter Übergabe von PAnsiChar an AnsiString/String beachten sollte.

UTF8String
SetString + SetCodePage wenn der String ein AnsiString, aber kein UTF8String ist
SetAnsiString inkl. SetCodePage
LStrFromPCharLen
TEncoding.GetString
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz