Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi D2009 ein Ratespiel mit UNICODE ? (https://www.delphipraxis.net/134652-d2009-ein-ratespiel-mit-unicode.html)

EWeiss 26. Mai 2009 12:28


D2009 ein Ratespiel mit UNICODE ?
 
Diverse probleme mit D2009.

D2006 funktioniert!
Aus DLL!

Delphi-Quellcode:
  // added song to Playlist
  for i := 0 to fAlbumList.Count - 1 do
    WAAddFile(Module1.hWNDParent, fFilePath + fAlbumList.Strings[i]);
Delphi-Quellcode:
function int_cds(mainwawnd: HWND; text: string; msg: Integer): Integer;
var
  cds: COPYDATASTRUCT;
begin
 cds.dwData := msg;
 cds.lpData := PChar(text);
 cds.cbData := lstrlen(cds.lpData)+1; {include space for null char}
 result := SendMessage(mainwawnd, WM_COPYDATA, 0, LPARAM(@cds));
end;

function WAAddFile(mainwawnd: HWND; FilePath: string): Integer;
begin
  result := int_cds(mainwawnd, FilePath, IPC_PLAYFILE);
end;
Delphi-Quellcode:
cds.lpData := PChar(text);
wird in der Anwendung wie folgt ausgewertet.

Delphi-Quellcode:
    // Plugin send new Playlist entry
    psAddPlaylistTitle:
    begin
       copyDataStruct := Pointer(BASSVIS_SetPlayState(@mVisParam, psAddPlaylistTitle));
       Title := string(copyDataStruct.lpData);
       frmMain.Plist.Add(Title);
       frmMain.playlist.Items.add(ExtractFileName(AnsiLeftStr(Title, Length(Title) - 4)));
    end;
kann hier übergeben in D2009 was ich will .. PwideChar oder PAnsiChar
Delphi-Quellcode:
cds.lpData := PChar(text);
in der Anwendung kommt immer ein falscher oder kein String an.

Auf was muss ich achten damit die Daten richtig ausgewertet werden.
Das problem ist das ich mit verschiedenen sprachen arbeite VB,NET,C usw..

Wie kann ich garantieren das in allen sprachen das richtige Ergebnis übergeben wird ?

gruss Emil

mkinzler 26. Mai 2009 12:30

Re: D2009 ein Ratespiel ?
 
Schon AnsiString für test versucht?

Luckie 26. Mai 2009 12:33

Aussagekräftiger Titel
 
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt.

EWeiss 26. Mai 2009 12:33

Re: D2009 ein Ratespiel ?
 
Zitat:

Zitat von mkinzler
Schon AnsiString für test versucht?

Ja für Text.

Das ist was ich meine "Versucht = RateSpiel"

Es muss doch Richtlinien geben an denen ich mich halten kann
damit ich sicher bin das am ende das richtige rauskommt.

gruss Emil

mkinzler 26. Mai 2009 12:35

Re: D2009 ein Ratespiel ?
 
Am Besten immer die
AnsiString + AnsiChar + PAnsiChar
(Unicode)String + (Wide)Char + P(Wide)Char

Bernhard Geyer 26. Mai 2009 12:42

Re: D2009 ein Ratespiel mit UNICODE ?
 
1, Nimm in der Funktion ein eigenes PChar welches du per StrAlloc anforderst. Damit umgehst du evtl. Probleme mit automatischer Referenzzählung oder das der Empfänger der Nachricht irgendeinen Mist mit den Daten vornimmt bevor die Daten kopiert werden.
2, Die Längenberechnung deines Buffers ist für Wide/Unicodestrings falsch! 1 Char = 2 Byte..

Delphi-Quellcode:
cds.cbData := (lstrlen(cds.lpData)+1) * SizeOf(PChar);
3, Wenn andere Programmiersprachen ins Spiel kommen nimmer immer Widestrings (PWideChar). Für .NET/Java ist z.B. ein Widestring der "natürliche" Stringtyp (AFAIK UTF16).

EWeiss 26. Mai 2009 13:31

Re: D2009 ein Ratespiel mit UNICODE ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal eure vorschläge umgesetzt!
Das mit der berechnung der Stringlänge scheint aber nicht ganz zu stimmen
Oder ist das normal bei UNICODE ? Siehe Pic.

Delphi-Quellcode:
function int_cds(mainwawnd: HWND; text: AnsiString; msg: Integer): Integer;
var
  cds: COPYDATASTRUCT;
begin
 cds.dwData := msg;
 cds.lpData := PAnsiChar(text);
 cds.cbData := (lstrlen(cds.lpData)+1) * SizeOf(PChar);
 result := SendMessage(mainwawnd, WM_COPYDATA, 0, LPARAM(@cds));
end;
In Winamp selbst funktioniert das Plugin in meinen Sample (Delphi) geht es nicht der string wird
nicht so ausgegeben wie es sein soll.

Warum geht SizeOf(PAnsiChar); nicht?

gruss Emil

mkinzler 26. Mai 2009 13:34

Re: D2009 ein Ratespiel mit UNICODE ?
 
Versuch mal SizeOf( AnsiChar)

EWeiss 26. Mai 2009 13:41

Re: D2009 ein Ratespiel mit UNICODE ?
 
Zitat:

Zitat von mkinzler
Versuch mal SizeOf( AnsiChar)

Danke habs mal versucht.
Dann ist der string leer

Ist wie ich sagte ein Ratespiel.
Verstehe ich nicht.

Der String sollte eigentlich nach *.mp3 abschließen tut er aber nicht.

gruss Emil

Uwe Raabe 26. Mai 2009 15:46

Re: D2009 ein Ratespiel mit UNICODE ?
 
Also erst einmal:
Sizeof(PChar) = Sizeof(PAnsiChar) = Sizeof(Pointer) = 4 (außer unter Delphi 1 und eventuell später mal Delphi 64bit)

Sizeof(Char) = Sizeof(WideChar) = 2 (unter D2009)

Sizeof(AnsiChar) = 1

Was den Code betrifft, würde ich mal dies versuchen:

Delphi-Quellcode:
cds.lpData := @text[1];         // Pointer auf das erste Zeichen im Text
cds.cbData := Length(text) + 1; // das *Sizeof(AnsiChar) kann man aus obigen Gründen weglassen
Die Deklaration des Parameters text als AnsiString ist dabei unbedingt notwendig! Eventuell empfiehlt es sich ein const davor zu setzen.

Und was das versuchen betrifft: In der Theorie sind Theorie und Praxis identisch, in der Praxis leider nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.
Seite 1 von 2  1 2      

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