![]() |
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:
wird in der Anwendung wie folgt ausgewertet.
cds.lpData := PChar(text);
Delphi-Quellcode:
kann hier übergeben in D2009 was ich will .. PwideChar oder PAnsiChar
// 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;
Delphi-Quellcode:
in der Anwendung kommt immer ein falscher oder kein String an.
cds.lpData := PChar(text);
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 |
Re: D2009 ein Ratespiel ?
Schon AnsiString für test versucht?
|
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.
|
Re: D2009 ein Ratespiel ?
Zitat:
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 |
Re: D2009 ein Ratespiel ?
Am Besten immer die
AnsiString + AnsiChar + PAnsiChar (Unicode)String + (Wide)Char + P(Wide)Char |
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:
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).
cds.cbData := (lstrlen(cds.lpData)+1) * SizeOf(PChar);
|
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:
In Winamp selbst funktioniert das Plugin in meinen Sample (Delphi) geht es nicht der string wird
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; nicht so ausgegeben wie es sein soll. Warum geht SizeOf(PAnsiChar); nicht? gruss Emil |
Re: D2009 ein Ratespiel mit UNICODE ?
Versuch mal SizeOf( AnsiChar)
|
Re: D2009 ein Ratespiel mit UNICODE ?
Zitat:
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 |
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:
Die Deklaration des Parameters text als AnsiString ist dabei unbedingt notwendig! Eventuell empfiehlt es sich ein const davor zu setzen.
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 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 08:36 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