Ben. Haltepunkt bei einfacher Funktion...



  • Hi,

    ich arbeite hier mit DLLs und irgendwo da scheint auch das Problem zu liegen, daher weiß ich nicht, ob das Forum hier richtig gewählt ist, WinAPI kam mir irgendwie nicht richtig vor, MFC auch nicht, vielleicht ist es ein DLL Problem, vielleicht aber auch Standard-C++.

    Das Problem ist, dass ein benutzerdefinierter Haltepunkt, wie VC es nennt, aufgerufen wird.
    Durch Debugging konnte ich die Stelle genau markieren, zwischen:

    lower(strProcess); // hier
    
    DLL string lower(const string& s)
    {
    	string temp(s);
    	MessageBox(0, "a1", "", 0);
    
    	for(string::iterator it = temp.begin(); it != temp.end(); ++it)
    	{
    		if(*it >= 'A' && *it <= 'Z')
    			*it -= 'A' - 'a';
    	}
    	MessageBox(0, "a2", "", 0);
    
    // und hier
    
    	return s;
    }
    

    Anzumerken ist, dass lower eine Funktion einer DLL ist und die Messagebox zum Debugging gedacht ist. Das return s ist hier nur ebenfalls zum Debugging gedacht.
    Jedenfalls taucht die Box auf und danach findet der benutzerdefinierte Haltepunkt statt, das kann ich absolut nicht nachvollziehen, der Rückgabewert wird doch nicht abgefangen.
    Noch verwunderlicher ist, wenn ich die Funktion der DLL entwende und so verwende, gibt es keine Probleme, hier noch die Header der DLL.

    #ifndef PARSE_
    #define PARSE_
    
    #include <string>
    
    using namespace std;
    
    #ifdef PARSE_EXPORTS
    #define DLL __declspec(dllexport)
    #else
    #define DLL __declspec(dllimport)
    #endif
    
    DLL string lower(const string& s);
    

    Eine weitere Seltsamkeit ist, dass es sich hierbei offensichtlich um ein Problem mit dem String handelt, denn die Funktion wird genau zwei mal aufgerufen, beim zweiten Aufruf gibt es das Problem. Ich ließ den ersten Aufruf mit dem gleichen String mal zwei Male erfolgen: Kein Problem
    Es liegt also auch nicht an der Anzahl der Aufrufe.

    :Global!services@euirc.net NOTICE QuanturasXP :[☻Logon News☻ - Nov 02 2003] All Austrian (.at) Users please use ☻irc.vie.at.euirc.net☻ - all Swiss (.ch) Users please use ☻irc.bas.ch.euirc.net☻

    Dies ist der String, der dem Programm das Genick bricht.
    Aber wie gesagt, wenn ich die lower-Funktion bei mir direkt im Programm, also nicht durch eine DLL, einbaue, funktioniert es.
    Ich habe dabei die Funktion lower innerhalb des Programms _lower genannt und rufe diese vor dem lower-Aufruf auf.

    Hier noch der Assemblercode aus näherer Umgebung:

    77F65519   mov         dword ptr [ebp-20h],eax
    77F6551C   push        dword ptr [ebp+14h]
    77F6551F   push        dword ptr [ebp+10h]
    77F65522   push        dword ptr [ebp+0Ch]
    77F65525   push        dword ptr [ebp+8]
    77F65528   call        eax
    77F6552A   mov         dword ptr [ebp-24h],eax
    77F6552D   or          dword ptr [ebp-4],0FFFFFFFFh
    77F65531   call        77F65541
    77F65536   mov         eax,dword ptr [ebp-24h]
    77F65539   call        77F949DD
    77F6553E   ret         10h
    77F65541   cmp         dword ptr [ebp-1Ch],0
    77F65545   je          77F6554F
    77F65547   push        dword ptr [ebp-1Ch]
    77F6554A   call        77F507D6
    77F6554F   ret
    77F65550   ret         4
    77F65553   int         3
    77F65554   int         3
    

    Ich bin wirklich ratlos, hat jemand eine Idee? 😞

    MfG Eisflamme




Anmelden zum Antworten