Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hilfe bei C++ Code nach Delphi Code (https://www.delphipraxis.net/31272-hilfe-bei-c-code-nach-delphi-code.html)

pajofego 6. Okt 2004 22:57


Hilfe bei C++ Code nach Delphi Code
 
Hallo Leute,

nachdem ich seit mehr als einem Jahr C++ geschädigt bin brauche ich eure Hilfe um folgenden Macro aus c++ in Delphi umzuwandeln:

Code:
#ifdef _DEBUG
   #define CHECK_HR(p) {if( FAILED(hr=(p))) {char strError[300];sprintf(strError,"DEBUG: HRESULT FAILED (%i) in file %s in line %d.",int(hr),__FILE__, __LINE__);MessageBox(NULL,strError,"HRESULT FAILED",MB_OK);return hr;}}
#else
   #define CHECK_HR(p)   {if( FAILED(hr=(p))) return hr;}
#endif
Wäre cool wenn mir einer bei der Übersetzung helfen könnte bin z.Zt. komplett raus aus pascal und finde net die richtigen Befehle etc.

:?: Noch eine Frage zur IDE!
Ich habe Delphi 6 und mich nervt es, dass wenn ich die Units wechsle der Codeexplorer den Baum wieder komplett zumacht und ich immer wieder meine Klasse öffnen muss, damit ich darin navigieren kann. Kann man das abstellen?

Danke,

pajofego

dizzy 6. Okt 2004 23:04

Re: Hilfe bei C++ Code nach Delphi Code
 
*kreisch* Ist das Code oder Wirrwarr? Ich weiss schon warum ich C nicht wirklich mag... ;)

(Sorry, konnt's mir net verkneifen.)

Kernel32.DLL 6. Okt 2004 23:07

Re: Hilfe bei C++ Code nach Delphi Code
 
Geht mir ähnlich...

Sry, aber wie wäre es denn ma mir einer ordentlichen Formatierung??

pajofego 6. Okt 2004 23:10

Re: Hilfe bei C++ Code nach Delphi Code
 
Zitat:

Zitat von dizzy
*kreisch* Ist das Code oder Wirrwarr? Ich weiss schon warum ich C nicht wirklich mag... ;)

(Sorry, konnt's mir net verkneifen.)

Sorry, ist ein bischen verwirrend, ist halt c(zääääh)++

Kurz gesagt soll es folgendes machen:

Im Debugmodus soll er mit in das Debugfenster eine Fehlermeldung reinschreiben, gleichzeitig hätte ich gerne die Zeilennummer und den Dateiname der Unit! Anschliessend folgt eine Meldung durch ein Dialogfeld. Übergabeparameter ist ein pointer! (Ist alles für DirectX-Anwendungen!)

Vielleicht wird meine Absicht jetzt etwas klarer.

Tubos 7. Okt 2004 08:24

Re: Hilfe bei C++ Code nach Delphi Code
 
Das mit der Zeilennummer und dem Dateinamen geht in Delphi nicht.
Wollte ich auch schonmal machen, und hier hat man mir gesagt dass das nicht geht.

maximov 7. Okt 2004 10:14

Re: Hilfe bei C++ Code nach Delphi Code
 
hmmm...

KA wie dieser salat nach delphi zu konvertiren ist aber _FILE_ und _LINE_ gibt es in delphi nicht, (nur mit extremen umwegen über die JCL und Map-files). Das einfachste wäre vielleicht eine Assertion, denn die zeigt die zeilen nummer und datei an:

Delphi-Quellcode:
assert(hr=0,'Result böse!');
ist aber möglicher weise nicht das, was du willst.

pajofego 7. Okt 2004 10:36

Re: Hilfe bei C++ Code nach Delphi Code
 
Gut, also die Compiler Macros __FILE__ und __LINE__ gibt es wohl noch nicht in Delphi. Würde aber trotzdem ganz gerne etwas mehr über die JCL und Map-Files erfahren. Wo kann ich dazu etwas finden.

Was ich noch unbedingt wissen müsste wären die Präprozessoranweisungen
Code:
#ifdef _DEBUG
...
#else
...
#endif
wie sieht denn sowas in Delphi aus?

Danke

P.S.: Hat niemand das gleiche Problem wie ich mit dem Code-Explorer?

Oxmyx 7. Okt 2004 10:49

Re: Hilfe bei C++ Code nach Delphi Code
 
Naja, da es __FILE__ und __LINE__ nicht in Delphi gibt, gestaltet sich die Übersetzung äußerst unspektakulär:

Delphi-Quellcode:
{$IFDEF _DEBUG}
function CHECK_HR(p: HRESULT): HRESULT;
var
  acError: array[0..255] of Char;
begin
  if FAILED(p) then begin
    ZeroMemory(@acError, sizeof(Char) * 256);
    strlfmt(acError, sizeof(Char) * 256, 'DEBUG: HRESULT FAILED %i', [p]);
    MessageBox(0, acError, 'HRESULT FAILED', MB_OK or MB_ICONERROR);
  end;
  Result := p;
end;
{$ELSE}
function CHECK_HR(p: HRESULT): HRESULT;
begin
  Result := p;
end;
{$ENDIF}
Da es in Delphi keine Makros gibt, muss die Funktion aber anders aufgerufen werden. In C++ würde man einfach schreiben:
Code:
CHECK_HR(...);
In Delphi stattdessen:
Delphi-Quellcode:
if FAILED(CHECK_HR(...)) then Exit;
Der Code ist übrigens nicht getestet, müsste aber funktionieren.

MagiSun1 7. Okt 2004 10:50

Re: Hilfe bei C++ Code nach Delphi Code
 
begin
if
then
else
end;
:mrgreen:

woki 7. Okt 2004 10:51

Re: Hilfe bei C++ Code nach Delphi Code
 
Hi,

nun, es geht schon einiges und auch ganz einfach, am einfachsten solange das Programm im Kontext der IDE (lokal oder remote debugging) läuft.

Schau dir mal die Compilerdirektive IFDEF, assertions, das Ereignisprotokoll, outputdebugstring, nicht anhaltende Breakpoints, und die anderen Möglichkeiten der Breakpoints an.

Damit kannst du sehr komfortabel Protokollieren und auswerten was passiert, und die schreiben auch Sourcefilenamen und Zeile in das Protokoll, und das kann man dann auch speichern.

Grüsse
Woki

fiasko 7. Okt 2004 10:53

Re: Hilfe bei C++ Code nach Delphi Code
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von pajofego
Gut, also die Compiler Macros __FILE__ und __LINE__ gibt es wohl noch nicht in Delphi. Würde aber trotzdem ganz gerne etwas mehr über die JCL und Map-Files erfahren. Wo kann ich dazu etwas finden.

Im Anhang eine Unit die ich verwende um Exceptions abzufangen und aus der Fehleradresse die Unit+Zeile zu ermitteln. Ist aus einem Projekt... muß also ein bißchen aufgeräumt werden, sollte aber nicht das Problem sein.
Das läßt sich sicher auch irgendwie einsetzen um die aktuelle Unit+Zeile zu bekommen wenn man dem GetMapAddressFromAddress die richtige Adresse gibt :gruebel:


Zitat:

Zitat von pajofego
Was ich noch unbedingt wissen müsste wären die Präprozessoranweisungen
Code:
#ifdef _DEBUG
...
#else
...
#endif
wie sieht denn sowas in Delphi aus?

Schau mal unter Compiler-Direktiven in der OH, da gibt es {$IF ...}, {$ENDIF}, ... Schalter.

Oxmyx 7. Okt 2004 10:57

Re: Hilfe bei C++ Code nach Delphi Code
 
Zitat:

Zitat von pajofego
Zitat:

Zitat von dizzy
*kreisch* Ist das Code oder Wirrwarr? Ich weiss schon warum ich C nicht wirklich mag... ;)

(Sorry, konnt's mir net verkneifen.)

Sorry, ist ein bischen verwirrend, ist halt c(zääääh)++

Kurz gesagt soll es folgendes machen:

Im Debugmodus soll er mit in das Debugfenster eine Fehlermeldung reinschreiben, gleichzeitig hätte ich gerne die Zeilennummer und den Dateiname der Unit! Anschliessend folgt eine Meldung durch ein Dialogfeld. Übergabeparameter ist ein pointer! (Ist alles für DirectX-Anwendungen!)

Vielleicht wird meine Absicht jetzt etwas klarer.

Hm... wieso weist du einen Zeiger einem HRESULT zu?

pajofego 7. Okt 2004 11:05

Re: Hilfe bei C++ Code nach Delphi Code
 
Zitat:

Zitat von Oxmyx
Zitat:

Zitat von pajofego
Zitat:

Zitat von dizzy
*kreisch* Ist das Code oder Wirrwarr? Ich weiss schon warum ich C nicht wirklich mag... ;)

(Sorry, konnt's mir net verkneifen.)

Sorry, ist ein bischen verwirrend, ist halt c(zääääh)++

Kurz gesagt soll es folgendes machen:

Im Debugmodus soll er mit in das Debugfenster eine Fehlermeldung reinschreiben, gleichzeitig hätte ich gerne die Zeilennummer und den Dateiname der Unit! Anschliessend folgt eine Meldung durch ein Dialogfeld. Übergabeparameter ist ein pointer! (Ist alles für DirectX-Anwendungen!)

Vielleicht wird meine Absicht jetzt etwas klarer.

Hm... wieso weist du einen Zeiger einem HRESULT zu?

Das war Blödsinn von mir! Sorry! Ich war wohl schon fast im Reich der Träume, als ich das geschrieben habe! ;-) Aber erst einmal danke für den Code oben. So habe ich mir das auch ungefähr vorgestellt.

An allen anderen Danke ich auch! Werde mir mal jetzt die einzelnen Vorschläge anschauen und durcharbeiten.

P.S.: Habe mir gerade die Hilfe von JCL angeschaut und unter dem Punkt "Debugging->Source Locations" Gibt es functions __FILE__ und __LINE__ ! Da müsste doch was gehen oder?

woki 7. Okt 2004 11:32

Re: Hilfe bei C++ Code nach Delphi Code
 
Ach ja,

Assertions kennen auch File und Zeilennummer des Problems, Beispiele für die Verwendung:

OH
AssertErrorProc
und
AssertErrorProc (Beispiel)

inclusive der Möglichkeit die auf eigene Ausgaberoutinen umzusetzen,

siehe obiges Beispiel und

Code:
procedure AssertErrorHandler(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
  S: String;
begin
  S := Format('%s (%s, line %d, address $%x)',
    [Message, Filename, LineNumber, Pred(Integer(ErrorAddr))]);
  writeln(myFile,s);
end;
Ergo: mit den entsprechenden Debuginformationen compiliert kennt die Anwendung Filename und Zeilennummer und man kommt auch recht einfach heran.

Grüsse
Woki

pajofego 7. Okt 2004 13:11

Re: Hilfe bei C++ Code nach Delphi Code
 
So jetzt habe ich es so, wie ich mir das in etwa vorgestellt habe. Danke nochmal an alle! Echst super Hilfe hier! Das einzige was mir bei Delphi noch nicht klar ist, ist die Sache mit der Debug und Release Version, die es unter VC gibt. Delphi erstellt nur eine Exe Datei und die ist abhängig von den gewählten Compileroptionen z.B.: {$D+} und etc. Ist das richtig? Bedeutet dann, in Delphi {$D+} = _DEBUG wie unter VC?

Danke nochmals.


Delphi-Quellcode:
{$IFDEF _DEBUG}
function CHECK_HR(p: HRESULT): HRESULT;
var
  acError: array[0..255] of Char;
begin
  if FAILED(p) then begin
    ZeroMemory(@acError, sizeof(Char) * 256);
    strlfmt(acError, sizeof(Char) * 256, 'DEBUG: HRESULT FAILED %d in file %s in line %d ', [p, __FILE__, __LINE__]);
    MessageBox(0, acError, 'HRESULT FAILED', MB_OK or MB_ICONERROR);
  end;
  Result := p;
end;
{$ELSE}
function CHECK_HR(p: HRESULT): HRESULT;
begin
  Result := p;
end;
{$ENDIF}


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