AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Rückgabe-Pointer PUTF8String aus DLL in String umwandeln?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von philipp.hofmann · begonnen am 16. Jan 2020 · letzter Beitrag vom 20. Jan 2020
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

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

  Alt 17. Jan 2020, 10:07
Hallo,
in der Doku steht als Rückgabewert PChar (* char).
siehe auch hier

https://github.com/Laex/Delphi-OpenC.../sdl2/SDL2.pas

Einfach mal damit probieren.

Außerdem fehlt mit die Initialisierung der gesamten Sache.

(https://wiki.libsdl.org/SDL_GetAudioDeviceName)
This function is only valid after successfully initializing the audio subsystem.
Heiko
  Mit Zitat antworten Zitat
Friedhelm Drecktrah
(Gast)

n/a Beiträge
 
#2

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

  Alt 17. Jan 2020, 15:26
Das läuft bei mir:

program SDLDemo;

{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils;

type
TSdlAudio = class
public
procedure GetAudioDeviceNames();
end;

const
SDL_INIT_TIMER = $00000001;
SDL_INIT_AUDIO = $00000010;
SDL_INIT_VIDEO = $00000020; // SDL_INIT_VIDEO implies SDL_INIT_EVENTS
SDL_INIT_JOYSTICK = $00000200; // SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS
SDL_INIT_HAPTIC = $00001000;
SDL_INIT_GAMECONTROLLER = $00002000; // SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK
SDL_INIT_EVENTS = $00004000;
SDL_INIT_SENSOR = $00008000;
SDL_INIT_NOPARACHUTE = $00100000; // compatibility; this flag is ignored.

DEVICE_TYPE_OUTPUT = 0;
DEVICE_TYPE_INPUT_CAPTURE = 1;

function SDL_Init(flags: integer): integer; cdecl; external 'SDL2.dll';
function SDL_GetNumAudioDevices(isCapture: integer): integer; cdecl; external 'SDL2.dll';
function SDL_GetAudioDeviceName(index: integer; isCapture: integer): PAnsiChar; cdecl; external 'SDL2.dll';

{ TSdlAudio }

procedure TSdlAudio.GetAudioDeviceNames();
var
initResult: integer;

numDevices: integer;
deviceId: integer;

deviceName: PAnsiChar;
begin
initResult := SDL_Init(SDL_INIT_AUDIO);
Writeln('initResult: ' + initResult.ToString());

numDevices := SDL_GetNumAudioDevices(0);
Writeln('numDevices: ' + numDevices.ToString());

for deviceId := 0 to numDevices - 1 do
begin
deviceName := SDL_GetAudioDeviceName(deviceId, DEVICE_TYPE_OUTPUT);
Writeln('deviceName: ' + deviceName);
end;
end;

var
sdlAudio: TSdlAudio;

begin
try
sdlAudio := TSdlAudio.Create;
sdlAudio.GetAudioDeviceNames();
sdlAudio.Free;

Writeln;
Writeln('Enter drücken...');
ReadLn;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;

end.


Gruß

Geändert von Friedhelm Drecktrah (17. Jan 2020 um 15:56 Uhr)
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
927 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 17. Jan 2020, 16:25
Diese SDL2.pas ist schon mal besser als die Version von http://www.flashavconverter.com/cont...yer-firemonkey.

Delphi-Quellcode:
var pDeviceName:PChar;
    deviceName:String;
    deviceNameList:TStringList;
    count,i:integer;
begin
    count:=SDL_GetNumAudioDevices(0);
    deviceNameList:=TStringList.Create();
    for i:=0 to count-1 do
    begin
      pDeviceName:=SDL_GetAudioDeviceName(0,0);
      deviceName:=UTF8ToString(pDeviceName^);
      deviceNameList.Add(deviceName);
    end;
end;
a) Hier kommt jetzt schon mal die richtige Anzahl an Devices zurück (was mir auch schon mal hilft),
b) nur für jedes Device kommt als Name ? zurück bei Verwendung von UTF8ToString(pDeviceName^)
Bei deviceName:=String(pDeviceName) oder deviceName:=StrPas(pDeviceName) oder deviceName:=Copy(pDeviceName, 1, maxInt) oder deviceName:=pDeviceName kommt 䕄䱌匠㈲〴⁔䤨瑮汥刨
楄灳慬⵹畁楤⥯ zurück


Damit bin ich an sich aber schon mal weiter. Nur läuft die Klasse nicht unter MacOS-64 (auch nicht, wenn ich den Type von TClose auf Integer setze).
Ich hoffe, dass Flash-AV-Converter hier die Tage die Funktion zur Verfügung stellt.

So einfach kann ich kein Beispiel-Projekt generieren, weil ich dies ja mit http://www.flashavconverter.com/cont...yer-firemonkey baue.
Müsste dann zuerst schauen, ob dies mit der Demo der Library auch gut zusammen geht.
  Mit Zitat antworten Zitat
TiGü

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

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
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
927 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 17. Jan 2020, 22:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 20. Jan 2020, 11:08
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
...
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 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-2025 by Thomas Breitkreuz