| 

.NET C# Java Javascript Exception

4
Hallo Codekicker,

ich bin gerade dabei ein alttes C-Projekt aus VC6-Zeiten zu aktualisieren. Bearbeitet wird das Projekt nun in MS VC++ Express 2010. Es sind etliche Funktionen enthalten, welche den Typ LPSTR (char*) zurückgeben. Intern werden verschiedene Zeichenfolgen mit Hilfe von LPSTR-Parametern manipuliert und letztendlich mit lstrcpy zusammengefügt.

Was nun nicht funktioniert ist z.B. dies:

LPSTR MyFunction(void)
{
LPSTR s1 = "sehr labger Text";
LPSTR s2 = "kurzer Text";
lstrcpy(s1, s2);
return s1;
}

Eigentlich müsste die Funktion den Inhalt von s2 zurückgeben, welcher nach dem Kopieren in s1 steht. Macht sie aber nicht, es wird der Inhalt von s1 zurückgegeben! Und warum hat dieser Code bei der Übersetzung in VC6 schon mal funktioniert?

Hat jemand eine Idee? Vielen Dank.
11.10.2011
traudi 231 5
3 Antworten
2
Nach verschiedenen Versuchen steht nun fest:

Die Definition von LPSTR s1 = "sehr labger Text" macht s1 zu einer Konstante! Deswegen funktioniert auch der danach folgende Aufruf von lstrcpy nicht.

Wird die Definition von s1 wie folgt geändert, dann funktioniert es:

LPSTR s1 = (LPSTR) malloc(_TEXT_BUFFER_LEN);

Vielen Dank für die Hinweise.
22.10.2011
traudi 231 5
0
Funktioniert das lstrcpy nicht, oder wird der Wert von der Funktion nicht zurückgegeben?

Mit Visual Studio 10 hat sich der Compiler geändert! Von VCBuild nach MSBuild. Da bin ich auch schon mal "reingefallen".
http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/e1f5e7a6-b2ed-4efb-b70d-6251b4b99d69/#fec1cced-582e-439f-a230-850f3d12d422

Siehe auch: Upgrading Projects from Earlier Versions of Visual C++
http://msdn.microsoft.com/en-US/library/kyb7zzw4.aspx

Kannst Du das "Platform Toolset" auf VC90 umstellen? Funktioniert es dann noch wie erwartet?

Ist nicht viel, aber vielleicht hilft es ja.

Ciao,
Mike
11.10.2011
Xantiva 2,3k 2 9
Der Augfruf von lstrcpy liefert schon nicht das gewünschte Ergebnis. Beim durchsteppen im Debugmodus wird im Rahmen dieses Aufrufes sogar eine "Schutzverletzung beim Schreiben..." ausgegeben, ohne dass es kracht. Deine Tips werde ich jetzt prüfen. Vielen Dank.

traudi 11.10.2011
0
Du kannst einen String aus der Funktion MyFunction nicht so zurückgeben.
Es sind dabei gleich mehrere Dinge bedenklich/falsch.

1. Kopiertst Du den String s2 an die Stelle von s1. Das geht nur daher gut, da s2 kürzer ist als s1. Für s1 wurde nur Platz für 16 Characters angelegt. Sollte s2 länger sein, dann kracht es bei lstrcpy.
2. Die Variablen s1 und s2 werden auf den Stack angelegt (lokale Variablen).
Nach dem Verlassen der Funktion MyFunction ist der Speicher auf den die beiden Variablen weisen undefiniert. Eine solche Implementierung ist definitiv falsch. Sollte es unter gewissen Umständen funktioniert haben, so ist das reiner Zufall.

Du kannst die Methode folgendermaßen deklarieren:
LPSTR s1 = "sehr labger Text";
int len = strlen(s1);
void MyFunction(LPSTR s1, int len)
{
LPSTR s2 = "kurzer Text";
// dann vielleicht noch eine Überprüfung ob s2 kürzer ist als s1
// und dann..
lstrcpy(s1,s2);
}
12.10.2011
khrl01 19 1

Stelle deine Kopieren-Frage jetzt!