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
Seite 2 von 2     12   
TiGü

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

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

  Alt 17. Jan 2020, 21: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
890 Beiträge
 
Delphi 10.4 Sydney
 
#12

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

  Alt 17. Jan 2020, 23: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.063 Beiträge
 
Delphi 12 Athens
 
#13

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

  Alt 20. Jan 2020, 12: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
...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:55 Uhr.
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