AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PWideChar und PAnsiChar

Ein Thema von EWeiss · begonnen am 18. Apr 2009 · letzter Beitrag vom 18. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

PWideChar und PAnsiChar

  Alt 18. Apr 2009, 16:53
Hab leider wieder ein kleines problem
Meine Function erwartet als Rückgabe PAnsiChar

Die Dll welche ich einlese übergibt PWideChar
Das ergebinis ist 'Visual Demo PlugIn'

Übergebe ich es aber an meine Funktion bleibt nur noch ein 'V' übrig
Wie kann ich das korrigieren ?

Kann es nicht ändern da die anderen Plugins alle ein PAnsiChar erwarten.

hier noch was code..

Delphi-Quellcode:
function BASSVIS_GetPluginName(Param: PBASSVIS_PARAM): PAnsiChar; stdcall;
begin
  BASSVISKIND_AIMP2: Result := PAnsiChar(BASS_AIMP2VIS_GetName(Param^.VisHandle))
end;

function BASS_AIMP2VIS_GetName(handle: HVIS): PWideChar; stdcall;
begin
  Result := VisInfo^.VisPointer.PluginInfo;
end;

  IAIMP2VisualPlugin = interface
    function AuthorName: PWideChar; stdcall;
    function PluginName: PWideChar; stdcall;
    function PluginInfo: PWideChar; stdcall;

gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 16:56
Du könntest einen harten Cast nach PWidechar durchführen und dann dir den String geben lassen.

Sinnvoller ist es aber eine Unicode-Interface neben den Ansi-Interface zu definieren.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:01
Zitat von Bernhard Geyer:
Du könntest einen harten Cast nach PWidechar durchführen und dann dir den String geben lassen.

Sinnvoller ist es aber eine Unicode-Interface neben den Ansi-Interface zu definieren.
Hab noch was code addiert ..
Schau bitte nochmal

Ich brauche als rückgabe PAnsiChar aber dann wird nur noch das 'V' ausgegeben.
Obwohl innerhalb der Funktion BASS_AIMP2VIS_GetName bei Result der richtige Name noch steht.

In BASSVIS_GetPluginName ist es dann nur noch 'V'

gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:03
Das sollte eigentlich mit


Delphi-Quellcode:
var

  test: PansiChar;
  pwchar: PWideChar;
begin
  test := 'Hallo';
  pwchar := StringToOleStr(test);
end;
funktionieren!
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:19
Zitat von lbccaleb:
Das sollte eigentlich mit


Delphi-Quellcode:
var

  test: PansiChar;
  pwchar: PWideChar;
begin
  test := 'Hallo';
  pwchar := StringToOleStr(test);
end;
funktionieren!
Das funktioniert nicht.
Delphi-Quellcode:
VisPointer : function: IAIMP2VisualPlugin; stdcall;
function PluginName: PWideChar; stdcall;
Setze ich die Funktion jetzt auf PAnsiChar
Delphi-Quellcode:
function BASS_AIMP2VIS_GetModuleName(handle: HVIS): PAnsiChar; stdcall;
Result := PAnsiChar(VisInfo^.VisPointer.PluginName);
bekomme ich nur ein 'V'

so!
Result := StringToOleStr(VisInfo^.VisPointer.PluginName); dann meckert er immer noch WideChar und Char..

gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:20
ein harter Cast ändert nur den Zeigertyp, aber nicht die enthaltenen Daten.

innerhalb einer Funktion könnte man auch sowas nutzen,
pwchar := PAnsiChar(AnsiString(test)); aber sobald man die Funktion/Prozedur verläßt, benötigt man einen Zwischenspeicher für die Ansi-Daten, damit diese nicht schon freigegeben sind, wenn sie dann außerhalb verwendet werden sollen.

Delphi-Quellcode:
var // globale TempVariable (aber global ist auch böse und hat Nachteile)
  testTemp: AnsiString;
 
var
  test: PWideChar oder WideString;
begin
  test := 'Hallo';

  ...
  //TestTemp := AnsiString(test);
  TestTemp := test;
  Result := PAnsiChar(testTemp);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:27
Ist das gleiche ..
Hier nochmal meine Funktion geändert.

Delphi-Quellcode:
function BASS_AIMP2VIS_GetName(handle: HVIS): PAnsiChar; stdcall;
var
  PluginInfo: PWideChar;

begin
  Result := nil;

  if (not A_ValidHandle(handle)) then
  begin
    BassFuncs^.SetError(BASS_ERROR_HANDLE);
    Exit;
  end;

  VisInfo := PAIMPVisInfo(Handle);

  BassFuncs^.SetError(BASS_OK);
  PluginInfo := VisInfo^.VisPointer.PluginInfo;

  Result := PAnsiChar(PluginInfo);

end;
Ergebnis ist 'V' sobald PWide nach PAnsiChar konvertiert wird.
Das ändert sich auch nicht wenn ich PluginInfo Global definiere.

gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:30
ich sagte doch, du mußt auch die Daten ändern und nicht nur den Typ

quasi:
Result := PAnsiChar(AnsiString(PluginInfo));
Delphi-Quellcode:
// Temp{ein AnsiString} := AnsiString(PluginInfo);
Temp{ein AnsiString} := PluginInfo; // dank Autokonvertierung von Delphi auch so möglich
Result := PAnsiChar(Temp);
nur muß das Temp außerhalb der Funktion defniert sein, damit sie nicht bei Funktionsende freigegeben wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:35
Zitat von himitsu:
ich sagte doch, du mußt auch die Daten ändern und nicht nur den Typ

quasi:
Result := PAnsiChar(AnsiString(PluginInfo));
Delphi-Quellcode:
// Temp{ein AnsiString} := AnsiString(PluginInfo);
Temp{ein AnsiString} := PluginInfo; // dank Autokonvertierung von Delphi auch so möglich
Result := PAnsiChar(Temp);
nur muß das Temp außerhalb der Funktion defniert sein, damit sie nicht bei Funktionsende freigegeben wird.
Ahh ..
Hab das nicht ganz verstanden.
So gehts jetzt!
Delphi-Quellcode:
function BASS_AIMP2VIS_GetName(handle: HVIS): PAnsiChar; stdcall;
var
  PluginInfo: PWideChar;

begin
  Result := nil;

  if (not A_ValidHandle(handle)) then
  begin
    BassFuncs^.SetError(BASS_ERROR_HANDLE);
    Exit;
  end;

  VisInfo := PAIMPVisInfo(Handle);
  PluginInfo := VisInfo^.VisPointer.PluginInfo;

  BassFuncs^.SetError(BASS_OK);
  Result := PAnsiChar(AnsiString(PluginInfo));

end;
Das Teufelszeug in Delphi mit der Konvertiererei. grmmm

gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: PWideChar und PAnsiChar

  Alt 18. Apr 2009, 17:40
Result := PAnsiChar(AnsiString(PluginInfo)); Hier hast du nur ein Problem:

Delphi legt da eine interne AnsiString-Variable an, welche in diesem Fall beim End. der Funktion freigegeben wird ... und du hast nur Glück, wenn danach rein zufällig der AnsiTest noch im RAM rumgammelt.

Wie gesagt, du mußt eine externe Variable für die Ansi-Version nutzen.

Nur hast du da ein Problem wenn diese Funktion mehrmals aufgerufen wird, da dann die Daten in der externen Variable nicht mehr konsistent sind.

Wenn nur EINE externe Variable genutzt würde, dann würde hier
Delphi-Quellcode:
P1 := BASS_AIMP2VIS_GetName(H1);
P2 := BASS_AIMP2VIS_GetName(H2);
P1 keine korrekten Daten mehr enthalten, da die für P1 verwendete Temp-Variable inzwischen für P2 verwendet wird.


Probier es mal so und schau was diese Funktion nun für einen Text zurückliefert
Delphi-Quellcode:
function BASS_AIMP2VIS_GetName(handle: HVIS): PAnsiChar; stdcall;
var
  PluginInfo: PWideChar;
  i: Integer;
  S: WideString;
  P: PAnsiChar;

begin
  Result := nil;

  if (not A_ValidHandle(handle)) then
  begin
    BassFuncs^.SetError(BASS_ERROR_HANDLE);
    Exit;
  end;

  VisInfo := PAIMPVisInfo(Handle);

  BassFuncs^.SetError(BASS_OK);
  PluginInfo := VisInfo^.VisPointer.PluginInfo;

  Result := PAnsiChar(AnsiString(PluginInfo));

  for i := 0 to 1000 do
  begin
    S := StringOfChar(WideChar(#123), 50);
    P := PAnsiChar(AnsiString(PluginInfo));
    if P = 123 then ;
  end;

end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:27 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