AGB  ·  Datenschutz  ·  Impressum  







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

D2009 ein Ratespiel mit UNICODE ?

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

n/a Beiträge
 
#1

D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 12:28
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;
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
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: D2009 ein Ratespiel ?

  Alt 26. Mai 2009, 12:30
Schon AnsiString für test versucht?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Aussagekräftiger Titel

  Alt 26. Mai 2009, 12:33
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: D2009 ein Ratespiel ?

  Alt 26. Mai 2009, 12:33
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: D2009 ein Ratespiel ?

  Alt 26. Mai 2009, 12:35
Am Besten immer die
AnsiString + AnsiChar + PAnsiChar
(Unicode)String + (Wide)Char + P(Wide)Char
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 12:42
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..

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).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 13:31
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
Miniaturansicht angehängter Grafiken
ohne_titel-1_146.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 13:34
Versuch mal SizeOf( AnsiChar)
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 13:41
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#10

Re: D2009 ein Ratespiel mit UNICODE ?

  Alt 26. Mai 2009, 15:46
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.
Uwe Raabe
  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 00:29 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