Inline-Expansion und .c_str() -> unerklärlicher Fehler



  • Hallo,

    in Zusammenhang mit der Compileroption 'Inline-Expansion deaktivieren' bin ich auf einen Fehler gestoßen, den ich mir nicht erklären kann.
    Wenn ich diese Option deaktiviere (also die Inline-Expansion aktiviere), funktionieren ab einem gewissem Zeitpunkt die Parameterübergaben an eine Funktion mittels .c_str() nicht mehr.
    Ab einem gewissem Zeitpunkt bedeutet konkret: In einer Schleife rufe ich externe Funktionen aus einer C-DLL auf. Der erste Durchlauf ist problemlos, beim zweiten Durchlauf geben die Funktionen dann -1 zurück, da die Parameter nicht stimmen.
    Ich habe auf meiner Hauptmaske einen Button, mit dem ich mir das Logfile anzeigen lassen kann. Das Logfile ist eine Textdatei, die ich mit ShellExecute aufrufe. Selbst dieser Aufruf funktioniert dann nicht mehr. Direkt nach Programmstart funktioniert der Aufruf noch. Laut Debugger steht auch der richtige Inhalt in der Variable (siehe Beispiel).

    void __fastcall TfrmHaupt::acLogfileAnzeigen(TObject *Sender)
    {
    	RunApplication(NameLogDatei.c_str(), 0);
    }
    
    void __fastcall TfrmHaupt::RunApplication(LPCTSTR FileName, LPCTSTR FileParam)
    {
       //AnsiString ErrTxt = FileName;
       //Application->MessageBox(ErrTxt.c_str(), "Fehler...", MB_OK | MB_ICONERROR);
       //Wenn ich hier FileName ausgebe, dann tritt der Fehler nicht auf?!?
    
       int ret = (int) ShellExecute(0, "open", FileName, FileParam, 0, SW_SHOWNORMAL);
       //in FileName steht laut Debugger der richtige String, ShellExecute gibt trotzdem einen Fehler zurück.
    
       if (ret <= 32) 
       {
          //...Fehlerbehandlung
       }
    }
    

    Mit diesem Fehler bin ich schon ganz schön reingefallen, denn diese Option wird gesetzt, wenn man bei den Compileroptionen auf 'Endgültig' klickt. Ich hab erst alles getestet, dann auf endgültig gestellt und dann ausgeliefert... Ich lasse den Compiler jetzt immer auf 'Debug' stehen, aber auf Geschwindigkeit optimiert. Dann wird das Programm zwar mit den Debug-Infos ausgeliefert, funktioniert aber so wie ich mir das dachte.

    Vielleicht kann mir ja einer die Ursache erklären oder auch ein paar Tipps für die Compileroptionen geben.

    Fincki



  • was steht in FileParam. Ev Leerzeichen die nicht in " " stehen?

    Ich lasse den Compiler jetzt immer auf 'Debug' stehen, aber auf Geschwindigkeit optimiert.

    M.E. schlecht, da der Compiler Optimierungen vornimmt, dass kann Probleme beim debuggen geben.



  • Christian211 schrieb:

    was steht in FileParam. Ev Leerzeichen die nicht in " " stehen?

    In FileParam steht 0 drin, siehe Funktionsaufruf von RunApplication im Beispiel.

    Christian211 schrieb:

    Ich lasse den Compiler jetzt immer auf 'Debug' stehen, aber auf Geschwindigkeit optimiert.

    M.E. schlecht, da der Compiler Optimierungen vornimmt, dass kann Probleme beim debuggen geben.

    Das die Optimierungen das Debuggen stören könnten klingt einleuchtend.



  • Welcher Fehler kommt den zurück?



  • Christian211 schrieb:

    Welcher Fehler kommt den zurück?

    Der abgebildete Code funktioniert soweit einwandfrei. Nur wenn ich die Inline-Expansion aktiviere gibts Probleme. Lies dir doch nocheinmal mein Ursprungspost durch, ist zwar viel Text und vielleicht kompliziert formuliert, aber da steht doch eigentlich alles. Wenn irgendetwas nicht zu verstehen ist frag bitte nach.

    Das eigentliche Problem ist kurz gesagt:
    Ab einem bestimmtem Zeitpunkt funktionieren alle C-Funktionsaufrufe mit .c_str() nicht mehr. Der richtige Übergabewert steht in der Variablen, kommt aber anscheinend nicht mehr bei der Funktion an.



  • Ich habe dein Post gelesen. Dort steht

    ShellExecute gibt trotzdem einen Fehler zurück.



  • Der von dir zitierte Kommentar ist in der Tat verwirrend. Dort hätte ich vielleicht noch dabei schreiben sollen, daß der Fehler nur bei entsprechender Compiler-Option auftaucht, und selbst dann nur, wenn das Programm vorher verschiedene andere Sachen gemacht hat. Das ganze ist halt aus einem größerem Projekt.
    Ich sollte mal einen Prototyp bauen, an dem man den Fehler direkt nachvollziehen kann. Das kann ich leider nur auf der Arbeit, im Moment hab ich keinen C-Builder zur Hand. Und auf der Arbeit habe ich normal keine Zeit.
    Ich weiss ja auch wie ich den Fehler vermeide, ich darf halt keine Inline-Expansionen nutzen.

    Mich interessiert aber der Hintergrund, und dafür habe ich noch zu wenig Verständnis was der Compiler überhaupt bei Inline-Expansionen macht. Meines Erachtens liegt ein Teil des Problems auch bei der Funktion .c_str().



  • Womit die Frage, welcher Fehler auftritt (er scheint ja einen konkreten Wert zu haben, nämlich <= 32) immer noch nicht beantwortet ist.

    Vielleicht ist es ja einer von denen:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp



  • Dasd schrieb:

    Womit die Frage, welcher Fehler auftritt (er scheint ja einen konkreten Wert zu haben, nämlich <= 32) immer noch nicht beantwortet ist.

    Vielleicht ist es ja einer von denen:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

    Keiner versteht mich, LoL.

    Im Ernst, die Fehlerbehandlung hat nichts mit meinem Problem zu tun. In dem Beispiel wurde selbige zur besseren Lesbarkeit ausgebaut. Wenn jemand interessiert ist, dann kann ich die morgen posten. Ich selbst habe die auch nur von irgendwo aus dem Web.

    Der Fehler selbst lautete irgendwie das keine Anwendung zugeordnet ist, aber das tut nichts zur Sache.

    Die Ursache liegt ja an der Übergabe, die auch bei beliebigen anderen C-Funktionen scheitert. Und zwar nur unter bestimmten Bedingungen (schwer zu erklären, muss echt mal ne kleine Demo bauen zum hier posten s.o.). Und dem will ich auf den Grund gehen.



  • Ich weiß nichtmal, wo der Fehler bei dir auftritt? Im auskommentierten Teil? Oder beim Aufruf von ShellExecute (dort wird aber kein .c_str() verwendet). Ich kenn mich nicht aus.



  • Shell Execute gibt mir unter oben genauer geschilderten 'mysteriösen' Umständen einen Fehler zurück. Dies ist aber nur ein Folgefehler!
    Irgendwie scheitert die Parameterübergabe mit c_str().

    Ein Anhaltspunkt für diese These ist, das wenn ich die auskommentierte Fehlermeldung im Beispiel aktiviere, und ich die fehlerauslösenden Umstände reproduziere, der Aufruf funktioniert. Baue ich die Meldung aus gibt die aufgerufene Funktion einen Fehler aus.

    Dies passiert nur bei externen Funktionen, also keine C-Builder Funktionen. Das Beispiel hab ich gewählt, weil ShellExecute auch eine 'externe' Funktion ist. Mysteriös habe ich gesagt, weil ich erst anscheinend eine gewisse Anzahl solcher Funktionen aufrufen muss, bis der Fehler auftritt. Und das ganze halt auch nur wenn ich Inline-Expressions aktiviert habe.

    Ich versuche vielleicht morgen mal ein Beispielprogramm zu schreiben, habe leider gerade keinen C-Builder zur Hand.


Anmelden zum Antworten