Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo,

wie kriege ich sowas:


LPCSTR pstr =
"test\0"
"ste\0"
"sst\0"
"ende";
[/PHP]

aus mehreren CStrings heraus,

denn so geht es doch nicht

[PHP]
CString str,test,ste,sst,ende;
test="test";ste="ste";sst="sst";ende="ende";


str.Format("%s%s%s%s",test,ste,sst,ende);

LPCSTR lps = (LPCSTR) str;

Geschrieben
Hallo,

wie kriege ich sowas:


LPCSTR pstr =
"test\0"
"ste\0"
"sst\0"
"ende";
[/PHP]

aus mehreren CStrings heraus,

denn so geht es doch nicht

[PHP]
CString str,test,ste,sst,ende;
test="test";ste="ste";sst="sst";ende="ende";


str.Format("%s%s%s%s",test,ste,sst,ende);

LPCSTR lps = (LPCSTR) str;

Du möchtest also die CStrings zusammenfügen?

+.

Geschrieben
nein das tue ich schon beriets ;) ,

Nein, eigentlich nicht. Die Nullzeichen zwischen den Teilstrings bekommst du mit Format nicht rein.


CString str;
LPSTR p = str.GetBuffer(17);
memcpy(p, "test\0ste\0sst\0ende", 17);
str.ReleaseBuffer(17);[/CODE]

ich will die richtig in LPCSTR casten
Das wiederum brauchst du gar nicht. CString hat einen Konvertierungsoperator dafür.
Geschrieben

ja hmm...

das Problem ist das ich es:


"test\0ste\0sst\0ende", 

als einzelne CStrings bekomme etwa so:

CString str,test,ste,sst,ende; 

test="test";ste="ste";sst="sst";ende="ende"; 

jetzt habe ich es so versucht klappt aber nicht

CString str,test,ste,sst,ende; 

	test="test";ste="ste";sst="sst";ende="ende"; 


	str = test+"\\0"+ste+"\\0"+sst+"\\0"+ende;


    LPSTR p = str.GetBuffer(17);

    memcpy(p, str, 17);

    str.ReleaseBuffer(17);

Geschrieben

Du kannst keine der CString-Funktionen benutzen, wenn du so etwas machen willst. Das schließt auch den operator+ ein.

Folgendes funktioniert:

CString str,test,ste,sst,ende; 
test="test";ste="ste";sst="sst";ende="ende";

LPSTR p = str.GetBuffer(17);
memset(p, 0, 17);
memcpy(p, test, test.GetLength());
p += test.GetLength() + 1;
memcpy(p, ste, ste.GetLength());
p += ste.GetLength() + 1;
memcpy(p, sst, sst.GetLength());
p += sst.GetLength() + 1;
memcpy(p, ende, ende.GetLength());

str.ReleaseBuffer(17);
[/CODE]

Geschrieben

CString str,test,ste,sst,ende; 

test="test";ste="ste";sst="sst";ende="ende"; 


LPSTR p = str.GetBuffer(17);

memset(p, 0, 17);

memcpy(p, test, test.GetLength());

p += test.GetLength() + 1;

memcpy(p, ste, ste.GetLength());

p += ste.GetLength() + 1;

memcpy(p, sst, sst.GetLength());

p += sst.GetLength() + 1;

memcpy(p, ende, ende.GetLength());


str.ReleaseBuffer(17);

jetzt will ich das ganze in eine Funktion schreiben, als rückgabe wert dachte ich mir CString der zurück mir

str.ReleaseBuffer(17);

liefert geht aber nicht. Was muss die Funktion dan zurück liefern ??

Geschrieben
jetzt will ich das ganze in eine Funktion schreiben, als rückgabe wert dachte ich mir CString der zurück mir str.ReleaseBuffer(17);

liefert geht aber nicht.

"Geht nicht" ist keine ausreichende Fehlerbeschreibung. Was bedeutet "geht nicht"? Wie sieht dein Code aus?

Geschrieben
"Geht nicht" ist keine ausreichende Fehlerbeschreibung. Was bedeutet "geht nicht"? Wie sieht dein Code aus?

ja stimmt, also

Fehler:

error C2664: '__thiscall CString::CString(const class CString &)' : Konvertierung des Parameters 1 von 'void' in 'const class CString &' nicht moeglich.Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden.

Funktion


CString  lalala::CString2LPSTR(CString test,CString ste,CString sst) 

{

	CString    str;

	LPSTR p = str.GetBuffer(17);

	memset(p, 0, 17);

	memcpy(p, test, test.GetLength());

	p += test.GetLength() + 1;

	memcpy(p, ste, ste.GetLength());

	p += ste.GetLength() + 1;

	memcpy(p, sst, sst.GetLength());

	p += sst.GetLength() + 1;


	memcpy(p,"ende",17);

	return sAttributes_gfs.ReleaseBuffer(17);

}

Geschrieben

ReleaseBuffer ist void, gibt also nichts zurück.

return str; sollte schon reichen.

Die 17 musst du erst ausrechnen, falls die Strings test, ste und sst keine feste Länge haben (Länge von test + Länge von ste + Länge von sst + Länge von "ende" + 3 für die drei Nullzeichen dazwischen).

Geschrieben

ich kann nicht mehr :(

die Funktion sieht jetzt so aus:


CString lala::CString2LPSTR(CString sdsn,CString server,CString sdatabase)
{
CString str;
int buffer = sdsn.GetLength()+server.GetLength()+sdatabase.GetLength()+24;
LPSTR pSAttributes = str.GetBuffer(buffer);
memset(pSAttributes, 0, buffer);
memcpy(pSAttributes, sdsn, sdsn.GetLength());
pSAttributes += sdsn.GetLength() + 1;
memcpy(pSAttributes, server, server.GetLength());
pSAttributes += server.GetLength() + 1;
memcpy(pSAttributes, sdatabase, sdatabase.GetLength());
pSAttributes += sdatabase.GetLength() + 1;

memcpy(pSAttributes,"Trusted_Connection=1.",buffer);
str.ReleaseBuffer(buffer);
return str;
}
[/PHP]

jetzt wenn ich sie nur so aufrufe :

[code] try { CString str; str=CString2LPSTR("DSN=myDSN","SERVER=mySer","DATABASE=myDB"); }catch( CException * e ) { TCHAR szCause[255]; CString strFormatted; e->GetErrorMessage(szCause, 255); } [/code]

krieg beim catch( CException * e ) Fehler:

[b]

Benutzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x778813b1

[/b]

Warum ??

Geschrieben

Mein Fehler, sorry :(

memcpy(pSAttributes,"Trusted_Connection=1.",buffer);

Hier darf als letzter Parameter nicht die Gesamtlänge, sondern nur die Länge des letzten Strings stehen, in deinem Fall also 21.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...