2010-11-20 5 views
3

Nun, ich habe versucht, eine kleine Test-App kompilieren, die ich arbeite.bestimmte Zeile des Codes mit Code 255 nach dem Ändern der Code-Generierung

So Dinge zu halten, kurz und einfach:

Wenn ich von „Multi Threaded DLL“ auf „Multi Threaded“, um loszuwerden, einige Abhängigkeiten, die folgende Codezeile meine Codegenerierung gesetzt meine Anwendung abstürzt (wo es läuft normalerweise ohne irgendwelche Fehler)

Der Unfall geschieht, wenn ich einen kurzen Weg zu einem langen Weg umwandeln möchte. als solche:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

Der Absturz tritt speziell in der ersten Zeile:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

So, hier irgendwelche Ideen, warum es plötzlich nicht mehr funktioniert, wenn Sie den Code-Generierung-Modus wechseln? Vielen Dank!

EDIT:

Nachdem ich einige Code-Umschreiben Ich schaffte es speziell um herauszufinden, stürzt ab, wenn

getenv("Temp"); 

sehr, sehr seltsam Sehen Ausführung, wie sie Arbeit in den anderen Modus funktioniert

+0

Gibt es Warnungen, wenn Sie das Projekt erstellen? – Dialecticus

+0

Nein, da ist es nicht, es wird einfach aus irgendeinem seltsamen Grund mit Code 255 beendet. – zeta

+1

Warum ist der 'reinterpret_cast' notwendig? Das Ergebnis von 'getenv' ist' char * ', das automatisch in' LPCSTR' (d. H. 'Const char *') umgewandelt wird. Wenn Sie Fehler ohne die Besetzung erhalten, sind sie wahrscheinlich wert, beachtet zu werden. –

Antwort

0

Versuchen Sie, das Projekt neu erstellen. Säubern Sie es, stellen Sie sicher, dass nichts im Ausgabeordner übrig ist, löschen Sie .ncb ebenfalls aus und bauen Sie dann.

+0

nein, funktioniert nicht ... – zeta

1

Stellen Sie sicher, dass alle Projekte (und alle Dateien dieser Projekte) konsistent auf das Kompilieren und Verknüpfen mit derselben Version der Laufzeitbibliotheken, d. H. Multithread-Statik, in Ihrem Fall eingestellt sind. Wenn Sie diese Optionen mischen, haben die Compiles und das verknüpfte Programm ein undefiniertes Verhalten. Stellen Sie außerdem sicher, dass Sie die richtigen Versionen der externen Bibliotheken (MFC usw.) kompilieren und verknüpfen. In einigen Fällen sind Sie auf die Verwendung bestimmter Laufzeitversionen beschränkt, z. Wenn Sie mit .Net zusammenarbeiten, müssen Sie die mehrköpfige DLL-Version verwenden.

0

Haben Sie in den Linker-Einstellungen nach dem Wechsel von dynamischer Laufzeit zu statisch libcmt.lib und libcpmt.lib als Abhängigkeiten angegeben? Wenn nicht, bitte versuchen Sie es. Und dann mach eine Neuerstellung.

+0

libcmt.lib ist bereits standardmäßig verknüpft, so scheint es. libpcmt.lib ich schaffte es, manuell zu verknüpfen, aber es stürzt immer noch – zeta

0

Sie sollten reinterpret_cast nicht verwenden, da es sich um Objekte handelt, die von anderen Klassen geerbt oder erben. Verwenden Sie einfach static_cast für Basistypen oder Zeiger auf Basistypen.

+0

Sind Sie sicher, dass Sie nicht an 'dynamic_cast' denken? 'reinterpret_cast' hat nichts mit Vererbung zu tun. –

+0

@Nick Meyer: Ja, ich war. –

1

Sie sollten den Rückgabewert von getenv überprüfen(), bevor er Zugriff auf:

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

Meine Vermutung ist, dass Ihr Programm nicht die Umgebungsvariable lesen kann und die resultierende NULL-Zeiger Zugriff wird zu Programmabstürzen führen .

Microsoft empfiehlt die Verwendung von getenv_s() statt, hier ist ihre MSDN Probe etwas für Ihre Arbeit geändert:

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

Ich persönlich würde stattdessen auf die WinAPI Funktion GetEnvironmentVariable() empfehlen Schalten, das Sie geben ein detailliertere Fehlermeldung (benutze GetLastError(), wenn die Funktion fehlgeschlagen ist), die dir helfen könnte, zum Ursprung deines Problems zu kommen (oder es mit einer dieser Alternativen zu beheben).

Verwandte Themen