Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Ord to VS c++ WCHAR (https://www.delphipraxis.net/192932-ord-vs-c-wchar.html)

EWeiss 2. Jun 2017 12:47


Ord to VS c++ WCHAR
 
wie bekomme ich ein Ord(34) = '\' nach C++ WCHAR portiert ?

Im Moment mache ich es so..
Code:
WCHAR Quote[] = { 34 };
Was mich dabei stört das Quote dann eine länge von 260 Chars hat.
Ich möchte aber nur den String '\'

gruss

DeddyH 2. Jun 2017 12:52

AW: Ord to WCHAR
 
Aus dem Hut würde ich behaupten:
Delphi-Quellcode:
WideChar(Ord('\'))

EWeiss 2. Jun 2017 12:53

AW: Ord to WCHAR
 
Zitat:

Zitat von DeddyH (Beitrag 1373316)
Aus dem Hut würde ich behaupten:
Delphi-Quellcode:
WideChar(Ord('\'))

C++ ?
Ord gibt es nicht in VS C++.

gruss

himitsu 2. Jun 2017 12:57

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von EWeiss (Beitrag 1373315)
Code:
WCHAR Quote[] = { 34 };
Was mich dabei aber stört das Quote dann eine länge von 260 Chars hat.
Ich möchte aber nur den String '\'

Warum definierst du es denn dann als Array/String?

Code:
WCHAR Quote[1] = { 34 };

// bzw.
WCHAR Quote = 34;

EWeiss 2. Jun 2017 12:59

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von himitsu (Beitrag 1373318)
Zitat:

Zitat von EWeiss (Beitrag 1373315)
Code:
WCHAR Quote[] = { 34 };
Was mich dabei aber stört das Quote dann eine länge von 260 Chars hat.
Ich möchte aber nur den String '\'

Warum definierst du es denn dann als Array/String?

Code:
WCHAR Quote = 34;

Gute Frage ;)

Werde es mal Testen Danke.

gruss

EWeiss 2. Jun 2017 13:01

AW: Ord to VS c++ WCHAR
 
Jo geht aber der String ist immer noch 260 Zeichen lang.
Werde es mal mit char testen.
funktioniert nicht.

Bei beiden Varianten ist der String wie gesagt immer noch 260 Chars lang.

gruss

bra 2. Jun 2017 13:16

AW: Ord to VS c++ WCHAR
 
Der Backslash ist unter C++ das Escape-Zeichen, muss also selbst eventuell escaped werden ('\\')?
Oder brauchst du \0 als Ende-Kennzeichen des Strings (#34+#0), wobei WCHAR ja eigentlich nur ein Char und kein String ist?

EWeiss 2. Jun 2017 13:40

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von bra (Beitrag 1373322)
Oder brauchst du \0 als Ende-Kennzeichen des Strings (#34+#0

Code:
Quote + L'\0'
Das Anhängen des null terminierten Chars hilft leider nicht.

Zitat:

ist unter C++ das Escape-Zeichen
Jo deshalb übergebe ich ja { 34 } Hex Zeichen.

Zitat:

wobei WCHAR ja eigentlich nur ein Char und kein String ist?
Jo ist richtig (habe mich nicht korrekt ausgedrückt) dann frage ich mich aber wie im Shot zu sehen warum dann die gesamte länge des Arrays von 260 Chars angezeigt wird und nicht nur 1 Char wenn ich es so definiere.
Code:
WCHAR Quote[1] = { 34 };
Danke.

gruss

Zacherl 2. Jun 2017 14:06

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von EWeiss (Beitrag 1373324)
dann frage ich mich aber wie im Shot zu sehen warum dann die gesamte länge des Arrays von 260 Chars angezeigt wird und nicht nur 1 Char wenn ich es so definiere.
Code:
WCHAR Quote[1] = { 34 };

Es muss wie folgt aussehen:
Code:
WCHAR Quote[2] = { 34, 0 };
Sonst fehlt die Nullterminierung und der String wird so lange, bis zufällig irgendwo im Speicher dahinter mal eine Null steht.

Alternativ kannst du String-Konstanten in C++ auch wie folgt definieren:
Code:
wchar* quote = L"MY STRING";
Hier würde die abschließende Null automatisch hinzugefügt. Das "L" kennzeichnet den String als "WideString".

Edit:
Glaube ich habe nicht ganz verstanden, was du eigentlich vorhast. Kannst du evtl. den kompletten relevanten Teil des C++ Codes mal posten?

EWeiss 2. Jun 2017 14:22

AW: Ord to VS c++ WCHAR
 
Code:
WCHAR Quote[] = { 34 };
...
Code:
S1 = INWSTR(0, sCfg, Quote);
...

Code:
long INWSTR(IN long nIndex, IN WCHAR* MainStr, IN WCHAR* Search) {
    long nRet = -1;
    long nLength = (long) wcslen(MainStr);
    if (nLength && (wcslen(Search))) {
        WCHAR* pdest;
        if (nIndex > -1) {
            pdest = wcsstr(&MainStr[nIndex], Search);
            if (pdest) { nRet = long(pdest - &MainStr[0]); }
        } else {
            nIndex += 1; if (nIndex < 0) { nIndex *= -1; }
            reverse(MainStr, nLength);
            pdest= wcsstr(&MainStr[nIndex], Search);
            if (pdest) { nRet = nLength - long(pdest - &MainStr[0]) - 1; }
            reverse(MainStr, nLength);
        }
    }
    return nRet + 1;
}
Die länge des Arrays Search = Quote ist 252 Chars lang sollte er aber nicht.

gruss

EWeiss 2. Jun 2017 14:29

AW: Ord to VS c++ WCHAR
 
Code:
WCHAR Quote[2] = { 34, 0 };
Das war die Lösung ;)
Wenn der Char '\' und die länge davon nicht exakt stimmt schlägt die Function INWSTR fehl.

Danke warst mir eine große Hilfe.

gruss

Zacherl 2. Jun 2017 14:40

AW: Ord to VS c++ WCHAR
 
Ahh okay, in diesem Falle kannst du die Funktion auch einfach so aufrufen:
Code:
S1 = INWSTR(0, sCfg, L"\\");
Da bist du in die Falle getappt, weil WCHAR* nicht ein einzelnes Zeichen, sondern einen kompletten String (in C Sprachen immer ein Zeiger (*) auf das erste Zeichen) darstellt. Dadurch, dass die C-Strings auch keine vorgestellte Länge (wie in Delphi) besitzen, müssen sie zwangsweise nullterminiert werden.

EWeiss 2. Jun 2017 14:45

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von Zacherl (Beitrag 1373334)
Ahh okay, in diesem Falle kannst du die Funktion auch einfach so aufrufen:
Code:
S1 = INWSTR(0, sCfg, L"\\");
Da bist du in die Falle getappt, weil WCHAR* nicht ein einzelnes Zeichen, sondern einen kompletten String (in C Sprachen immer ein Zeiger (*) auf das erste Zeichen) darstellt. Dadurch, dass die C-Strings auch keine vorgestellte Länge (wie in Delphi) besitzen, müssen sie zwangsweise nullterminiert werden.

Sieht so aus ;)

Aber diese Funktion habe ich vorher getestet und brachte keinen Erfolg seltsam.
Muss dem nochmal nachgehen.
Kann mir dann die Definition sparen.

EDIT:
Nein das funktioniert definitiv nicht.
Dann werden keine Icons geladen irgendwie kommt WCHAR * mit L"\\" nicht zurecht.

gruss

Zacherl 2. Jun 2017 14:47

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von EWeiss (Beitrag 1373336)
Aber diese Funktion habe ich vorher getestet und brachte keinen Erfolg seltsam.

Wichtig ist, dass du das Backslash doppelt schreibst, sonst gillt es unter C/C++ als Escape Zeichen.

EWeiss 2. Jun 2017 14:50

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von Zacherl (Beitrag 1373337)
Zitat:

Zitat von EWeiss (Beitrag 1373336)
Aber diese Funktion habe ich vorher getestet und brachte keinen Erfolg seltsam.

Wichtig ist, dass du das Backslash doppelt schreibst, sonst gillt es unter C/C++ als Escape Zeichen.

Danke nein es geht nicht siehe mein Edit :)
Wenn ich das so übergebe dann ist das Ergebnis 92 muss aber 34 sein.
Ich glaube man darf den Char im nachhinein nicht verändern er muss Exakt sein.

Also Char(34) + null terminierten Char

gruss

EWeiss 2. Jun 2017 15:15

AW: Ord to VS c++ WCHAR
 
es würde so gehen.. Theoretisch.. Praktisch nicht!
Code:
S1 = INWSTR(0, sCfg, L"\"\"");
Theoretisch und Praktisch hätte ich dann ein Ergebnis von 34.

Praktisch jedoch wäre der Array String dann länger wie 1 kann man ja auch so schon sehen. ;)
Das führt dann dazu das meine Funktion fehl schlägt.

gruss

Zacherl 2. Jun 2017 15:16

AW: Ord to VS c++ WCHAR
 
Willst du überhaupt den Backslash? Weil #34 ist ". Dementsrpechend müsste es dann natürlich
Code:
L"\""
heißen.

EWeiss 2. Jun 2017 15:19

AW: Ord to VS c++ WCHAR
 
Zitat:

Zitat von Zacherl (Beitrag 1373343)
Willst du überhaupt den Backslash? Weil #34 ist ". Dementsrpechend müsste es dann natürlich
Code:
L"\""
heißen.

JA das war die optimale Lösung ;)
Danke wieder mal..

gruss


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