Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Brauche Hilfe bei Übersetzung von c++-code nach Delphi... (https://www.delphipraxis.net/77588-brauche-hilfe-bei-uebersetzung-von-c-code-nach-delphi.html)

bingo72 21. Sep 2006 15:20


Brauche Hilfe bei Übersetzung von c++-code nach Delphi...
 
Hallo Experten!!

Ich sitze nun schon mehrere Tage an folgenden Code rum und komm einfach auf keinen grünen Zweig...
Ich bin echt nicht faul und auch nicht bequem mir den Code selbst zu übersetzen, wenn ich es könnte. Bitte um Hilfe, denn mir wäre damit sehr geholfen:

Code:
 if(file.Open(_T("C:\\Program Files\Windows Media
Components\Encoder\Profiles\myprofile.prx"),CFile::modeRead)!=0){ 
                        WCHAR* perfilXML=new WCHAR[file.GetLength()];
                        file.Read(perfilXML,file.GetLength());
                        file.Close();
Was ich bislang zusammengebracht habe war folgendes...

Delphi-Quellcode:
    fStream := TFileStream.Create(APATHTOFILE + 'profile.prx', fmOpenRead);
    s := '';
    SetLength(s, fStream.Size);
    fStream.Read(s, fStream.Size);
    fStream.Free;
Bitte um Kontrolle und Korrektur....

Danke!!

[edit=Phoenix] C-und Delphi-Code-Tags eingefügt. Das nächste mal bitte gleich selber dran denken. Mfg, Phoenix[/edit]

hoika 21. Sep 2006 15:33

Re: Brauche Hilfe bei Übersetzung von c++-code nach Delphi..
 
Hallo,

und wo ist jetzt das Problem ?
Ich würde eh überlegen,
direkt eine XML-Lesekomponente zu benutzen.
Das kommt aber auf den Verwendungszweck an.

Beim Überblättern fällt mir noch auf,
vielleicht statt Read(s) Read(@s) zu benutzen
aber mit Streams arbeite ich nicht.


Heiko

bttb930 21. Sep 2006 16:13

Re: Brauche Hilfe bei Übersetzung von c++-code nach Delphi..
 
warum nicht einfach

Delphi-Quellcode:
  sl := TStringList.Create;
  sl.LoadFromFile('...filename...');

Der_Unwissende 21. Sep 2006 17:15

Re: Brauche Hilfe bei Übersetzung von c++-code nach Delphi..
 
Hi,
es gibt ein paar Dinge, auf die du achten solltest. So kann ein XML File UTF-8 oder UTF-16 kodiert sein.
Der C Code verwendet WChar, das würde ich doch einfach mal ein Array von Widechars (16 Bit) deuten, so dass hier immer von UTF-16 augegangen wird. Der normale Delphi String ist aber eine AnsiString, du solltest hier also lieber einen Widestring verwenden. Dabei gilt es dann zu beachten, dass du pro Zeichen 2 Byte hast, der also nur Stream.Size div 2 groß wird.

Den String s brauchst du zudem nicht mit '' initialisieren, wenn du danach die Länge veränderst. Da wird (imho) der alte String dann eh verworfen und neuer Speicher alloziert (verworfen heißt nicht, dass der Inhalt nicht kopiert wird, aber du legst halt zwei mal Speicher an). Andererseits wird der Compiler das eh wegoptimieren (denke ich).

Was @s angeht, von dem Tipp würde ich dir abraten, da bekommst du nämlich die falsche Adresse. Wenn man Strings oder dyn. Arrays addressiert, dann sollte man immer den Index angeben. @s zeigt auf einen Teil, den du nicht beschreiben solltest.
@s[1] (Strings sind 1 indexiert) wäre dann eher korrekt. Ob man das bei Streams braucht oder nicht weiß ich gerade nicht (ich weiß dass ich hier schonmal den falschen Tipp gab und lasse ihn hier weg).

Ja, ansonsten sieht dass was du tust schon richtig aus. Allerdings gibt es da noch Potenzial etwas zu verbessern. Wenn du eine Datei zum Lesen öffnest, solltest du sie ruhig zum Schreiben sperren. Damit du lesen kannst musst du ein Handle auf die Datei bekommen (macht der Stream aut.). Damit solltest du aber auch dafür sorgen, dass der Stream auf jedem Fall (auch bei einem Fehler) freigegeben wird. Deshalb gehört da ein so genannter Ressourcen-Schutzblock hin.
Und damit andere deinen Code leichter lesen können, solltest du die Codetags verwenden (die findest du über dem Edit in dem du einen Beitrag tippst). Da gibt es sowohl für C als auch für Delphi Code Auszeichnungen. Werden die verwendet, ist der Code als solcher markiert (und es gibt auch Syntaxhighlighting).

Delphi-Quellcode:
fStream := TFileStream.Create(A_PATH_TO_FILE + 'profile.prx', fmOpenRead or fmShareDenyWrite);
try
  setLength(s, fStream.Size);

  if not fStream.Read(s, fStream.Size) = fStream.Size then
  begin
    // Achtung, es wurden weniger Zeichen gelesen als du vorgegeben hast
  end;
finally
  fStream.Free;
end;
So sähe das mit Schutzblock aus, der stellt halt sicher, dass die Datei auf jeden Fall wieder frei gegeben wird.

Gruß Der Unwissende

bingo72 22. Sep 2006 06:38

Re: Brauche Hilfe bei Übersetzung von c++-code nach Delphi..
 
Vielen Dank für Eure Unterstützung...

Dies ist jener Coder der mich zum Erfolg führte...

Delphi-Quellcode:
hr := WMCreateProfileManager(pWMProfileManager);
    with TFileStream.Create(APATHTOFILE + 'profile.prx', fmOpenRead)do begin
      Read(i, SizeOf(i));
      SetLength(s, i);
      Read(s[1], i);
      Free
    end;
    hr := pWMProfileManager.LoadProfileByData(PWideChar(s), pProfile);
    hr := pASFInterface.ConfigureFilterUsingProfile(pProfile);
[edit=Phoenix] Und auch hier hat das Code-Tag gefehlt. Mfg, Phoenix[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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