Debug Version geht Release Version nicht(exe+dll)



  • Hallo,
    ich bins mal wieder.

    Endlich bin ich mit meiner Sprachausgabe soweit fertig, und habe es sogar geschafft Sie in eine dll zu packen! ich bin ganz aufgeregt :p

    Die Debug Version der Anwendung arbeitet ohne Probleme mit der Debug dll oder der Release dll.

    Nun wollte ich das Programm weiter geben, und stelle fest das die Release Anwendung beim zweiten Aufruf der Funktion die auf die dll zugreift abstürzt 😡

    Ich habe 6 Stunden rumprobiert und komme nicht drauf:

    Es wäre echt stark wenn Ihr euch das mal anschaut. Wenn jemand an dem ganzen Projekt interessiert ist, oder glaubt mir dann besser helfen zu können dem schicke ich es gerne zu da es ja sowieso Freeware ist.

    hier ist der Code:

    Header der Testaplikation:

    #if !defined(AFX_ASSPEEKSAMPLEDLG_H__8C1D965F_3C6D_4968_8F89_9CF8185ECD94__INCLUDED_)
    #define AFX_ASSPEEKSAMPLEDLG_H__8C1D965F_3C6D_4968_8F89_9CF8185ECD94__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // CAsspeeksampleDlg Dialogfeld
    #include "..\asspeek\asspeekClass.h" // the assspeekClass header
    
    class CAsspeeksampleDlg : public CDialog
    {
    // Konstruktion
    public:
        CAsspeeksampleDlg(CWnd* pParent = NULL);    // Standard-Konstruktor
        CasspeekClass objasspeekClass; // the asspeek Class
    
        void Stopspeek();
    // Dialogfelddaten
        //{{AFX_DATA(CAsspeeksampleDlg)
        enum { IDD = IDD_ASSPEEKSAMPLE_DIALOG };
        CButton m_cStopSpeek;
        CButton m_cSpeekTheText3;
        CButton m_cSpeekTheText2;
        CButton m_cSpeektheClipboard;
        CListBox    m_cOutputList;
        CEdit   m_cSpeekText3;
        CComboBox   m_cSpeekText2;
        CString m_strSpeekText2;
        CString m_strSpeekText3;
        //}}AFX_DATA
    
        // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
        //{{AFX_VIRTUAL(CAsspeeksampleDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
        //}}AFX_VIRTUAL
    
    // Implementierung
    protected:
        HICON m_hIcon;
    
        // Generierte Message-Map-Funktionen
        //{{AFX_MSG(CAsspeeksampleDlg)
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        afx_msg void OnSpeekthetext3();
        afx_msg void OnSpeekthetext2();
        afx_msg void OnViewtheclipboard();
        afx_msg void OnSpeektheclipboard();
        afx_msg void OnStopspeek();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_ASSPEEKSAMPLEDLG_H__8C1D965F_3C6D_4968_8F89_9CF8185ECD94__INCLUDED_)
    

    die Teile der cpp Aplikation:

    BEGIN_MESSAGE_MAP(CAsspeeksampleDlg, CDialog)
        //{{AFX_MSG_MAP(CAsspeeksampleDlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_SPEEKTHETEXT3, OnSpeekthetext3)
        ON_BN_CLICKED(IDC_SPEEKTHETEXT2, OnSpeekthetext2)
        ON_BN_CLICKED(IDC_VIEWTHECLIPBOARD, OnViewtheclipboard)
        ON_BN_CLICKED(IDC_SPEEKTHECLIPBOARD, OnSpeektheclipboard)
        ON_BN_CLICKED(IDC_STOPSPEEK, OnStopspeek)
        ON_MESSAGE(WM_USER_MESSAGE, Stopspeek)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    aufruf der Funktion in der dll:
    void CAsspeeksampleDlg::OnSpeekthetext3() 
    {
        CString texttospeek;
        GetDlgItemText( IDC_SPEEKTEXT3, texttospeek); //strText z.B mein name ist hans
        m_cSpeekTheText2.EnableWindow(FALSE);
        m_cSpeekTheText3.EnableWindow(FALSE);
        m_cSpeektheClipboard.EnableWindow(FALSE);
        m_cStopSpeek.EnableWindow(TRUE);
        objasspeekClass.SetWndHandle(this);
        objasspeekClass.asspeek(texttospeek);   
    }
    
    void CAsspeeksampleDlg::Stopspeek() 
    {
        MessageBox("schleife zuende");
        m_cSpeekTheText2.EnableWindow(TRUE);
        m_cSpeekTheText3.EnableWindow(TRUE);
        m_cSpeektheClipboard.EnableWindow(TRUE);
        m_cStopSpeek.EnableWindow(FALSE);
        objasspeekClass.stopspeek();    
    }
    
    und in der StdAfx.h:
    #define WM_USER_MESSAGE WM_USER+0x100
    

    header der dll:

    // asspeekClass.h: Schnittstelle für die Klasse CasspeekClass.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_)
    #define AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CasspeekClass  
    {
    private:
        CWnd* m_pWnd;
        CString m_strText;
    
    public:
        inline void SetWndHandle(CWnd* pWnd) { m_pWnd = pWnd; }
    
        int texttospeek;
        int m_Flag;
    
        static UINT speekthetext (LPVOID lpvoid); // speek thread 
        void SpeekRun();            // speek run void
        __declspec(dllexport) CString SayHello (CString strName);
        __declspec(dllexport) CString wave (CString strName);
        __declspec(dllexport)playwave();
        __declspec(dllexport)speektext();
        __declspec(dllexport)asspeek(CString m_strText);
        __declspec(dllexport)startspeek();
        __declspec(dllexport)stopspeek();
        __declspec(dllexport)CasspeekClass();
        __declspec(dllexport)virtual ~CasspeekClass();
    
    };
    
    #endif // !defined(AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_)
    

    die Funktion in der dll:

    CasspeekClass::asspeek(CString strtext)
    {
        m_strText = "";
        CString strText;
        m_strText+=strtext;
        //AfxMessageBox(m_strText);
        m_Flag = 1; 
        CWinThread* pThread = AfxBeginThread (speekthetext, this);
    }
    CasspeekClass::startspeek()
    {
        m_Flag = 1; 
    }
    
    CasspeekClass::stopspeek()
    {
        m_Flag = 0; 
    }
    
    UINT CasspeekClass::speekthetext(LPVOID lpvoid) 
    { 
        CasspeekClass* pDlg = (CasspeekClass*) lpvoid; 
        pDlg->SpeekRun();
        return 0; 
    } 
    
    void CasspeekClass::SpeekRun()
    {
        HMODULE hModule = GetModuleHandle("asspeek.dll");   
        CString strText;
        strText +=m_strText;
        strText.MakeLower();
        //m_cTextTemp
        //int m_Flag = 1;
        for (int i=0; i< strText.GetLength(); i++)
        {
    
            //// ----------------------------------- Silben ------------------------------------- ////
    
            char* VierStellenSilbe[] = {"mail","hall","down","load","uche"}; // 5
    
            char* DreiStellenSilbe[] = {"dra","dre","dro","dru","lei","lie","wei","www"," pc","pc ",
                                        "sch",".de","all","mir","dir","ben","ach","och","min","max",
                                        "kau","mei","mai","bei","ker","bis","pau","bau","bun","ter",
                                        "net","com"}; // 32
    
            char* ZweiStellenSilbe[] = {"ba","be","bo","bu","da","de","do","du","ei","eu",
                                        "ga","ge","go","gu","la","le","lo","lu","ss","mm",
                                        "nn","ck","ie","ch","sp","ha","ho","hu","ka","ko",
                                        "ku","ma","zz","mo","mu","na","ne","no","nu","ta",
                                        "to","tu","ch","au","er","pa","pe","po","pu"};// 49
    
            char* EineStelleSilbe[]  = {"a","b","c","d","e","f","g","h","i","j",
                                        "k","l","m","n","o","p","q","r","s","t",
                                        "u","v","w","x","y","z"," ","ä","ö","ü",
                                        "ß","0","1","2","3","4","5","6","7","8",
                                        "9",".",",",";","(",")","{","}","[","]",
                                        "-","+","@","=","\"","/","\\","!","?","#",
                                        "%","*","&","<",">",":","`","~","$","²",
                                        "_","|"}; // 72
    
            //// ----------------------------------- Wave IDS ----------------------------------- ////
    
            int VierSilbenID[] = {IDR_email,IDR_hall,IDR_down,IDR_load,IDR_uche}; // 5
    
            int DreiSilbenID[] = {IDR_dra, IDR_dre, IDR_dro, IDR_dru, IDR_lei, IDR_lie, IDR_wei, IDR_www, IDR__pc, IDR__pc,
                                  IDR_sch, IDR__punktDE, IDR_all, IDR_mir, IDR_dir, IDR_ben, IDR_ach, IDR_och, IDR_min, IDR_max, 
                                  IDR_kau, IDR_mei, IDR_mai, IDR_bei, IDR_ker, IDR_bis, IDR_pau, IDR_bau, IDR_bun, IDR_ter,
                                  IDR_net, IDR_com}; // 32
    
            int ZweiSilbenID[] = {IDR_ba, IDR_be, IDR_bo, IDR_bu, IDR_da, IDR_de, IDR_do, IDR_du, IDR_ei, IDR_eu,
                                  IDR_ga, IDR_ge, IDR_go, IDR_gu, IDR_la, IDR_le, IDR_lo, IDR_lu, IDR_s,  IDR_m,
                                  IDR_n,  IDR_ck, IDR_ie, IDR_ch, IDR_sp, IDR_ha, IDR_ho, IDR_hu, IDR_ka, IDR_ko, 
                                  IDR_ku, IDR_ma, IDR_z,  IDR_mo, IDR_mu, IDR_na, IDR_ne, IDR_no, IDR_nu, IDR_ta, 
                                  IDR_to, IDR_tu, IDR_ch, IDR_au, IDR_er, IDR_pa, IDR_pe, IDR_po, IDR_pu}; // 49
    
            int EineSilbeID[]  = {IDR_a, IDR_b, IDR_c, IDR_d, IDR_e, IDR_f, IDR_g, IDR_h, IDR_i, IDR_j,
                                  IDR_k, IDR_l, IDR_m, IDR_n, IDR_o, IDR_p, IDR_q, IDR_r, IDR_s, IDR_t,
                                  IDR_u, IDR_v, IDR_w, IDR_x, IDR_y, IDR_z, IDR__blank, IDR_ae_, IDR_oe_, IDR_ue_,
                                  IDR_s,    IDR_0, IDR_1, IDR_2, IDR_3, IDR_4, IDR_5, IDR_6, IDR_7, IDR_8,
                                  IDR_9, IDR__punkt, IDR__komma, IDR__semicolon, IDR__klammerauf, IDR__klammerzu, IDR__klammerauf, IDR__klammerzu, IDR__eckigeklammerauf, IDR__eckigeklammerzu,
                                  IDR__minus, IDR__plus, IDR__aetzeichen, IDR__gleich, IDR__anfuehrungszeichen, IDR__slash, IDR__backslash, IDR__ausrufezeichen, IDR__fragezeichen, IDR__raute,
                                  IDR__prozent, IDR__sternchen, IDR__und, IDR__kleinerals, IDR__groesserals, IDR__doppelpunkt, IDR__apostroff, IDR__welle, IDR__dollar, IDR__hochzwei,
                                  IDR__unterstrich, IDR__trennstrich}; // 72
    
            //// --------------------------------- Wave Pausen ---------------------------------- ////
    
            int VierSilbenP[]  = {350,   250,   350,   350,   350}; // 5
    
            int DreiSilbenP[]  = {250,   250,   250,   250,   250,   250,   250,   250,   250,   250,
                                  150,   250,   250,   250,   250,   120,   250,   250,   250,   250,
                                  150,   250,   250,   250,   250,   250,   250,   250,   250,   250,
                                  250,   250}; // 32
    
            int ZweiSilbenP[]  = {140,   140,   140,   140,   140,   140,   140,   160,   140,   140,
                                  140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
                                  140,   140,   140,   140,   140,    90,   140,   140,   140,   140,
                                  140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
                                  140,   140,   140,   140,   140,   140,   140,   140,   140}; // 49
    
            int EineSilbeP[]   = { 80,    80,    80,    80,    80,    80,    30,    80,    80,    80,
                                   80,    80,    80,    80,    80,    80,    80,    30,    80,    80,
                                   80,    80,    80,    40,    80,    80,   160,    40,    40,    40,
                                   60,   350,   350,   350,   350,   350,   350,   350,   350,   350,
                                  350,   350,   350,   650,   650,   650,   650,   650,  1150,  1150,
                                  350,   650,   650,   650,  1350,   650,   650,   650,   650,   650,
                                  350,   650,   650,   650,  1350,   650,   650,   650,   650,   650,
                                  650,   650}; // 72
    
            //// ----------------------------- Abfrage Zeichenfolge ----------------------------- ////
            for(int j = 0;j < 5;j++) 
            { 
              if (m_Flag==1) {
                 CString strVierStellen = strText.Mid(i, +4);
                 if(strcmp(strVierStellen,VierStellenSilbe[j]) == 0) 
                 { 
                 ::PlaySound(MAKEINTRESOURCE(VierSilbenID[j]), hModule, SND_RESOURCE | SND_ASYNC ); 
                 Sleep(VierSilbenP[j]);
                 i+=4;
                 }
              }
            }
            for(int k = 0;k < 32;k++) 
            { 
              if (m_Flag==1) {
                 CString strDreiStellen = strText.Mid(i, +3);
                 if(strcmp(strDreiStellen,DreiStellenSilbe[k]) == 0) 
                 {
                 ::PlaySound(MAKEINTRESOURCE(DreiSilbenID[k]), hModule, SND_RESOURCE | SND_ASYNC );
                 Sleep(DreiSilbenP[k]);
                 i+=3;
                 } 
              }
            }
            for(int l = 0;l < 49;l++) 
            { 
              if (m_Flag==1) {
                 CString strZweiStellen = strText.Mid(i, +2);
                 if(strcmp(strZweiStellen,ZweiStellenSilbe[l]) == 0) 
                 { 
                 ::PlaySound(MAKEINTRESOURCE(ZweiSilbenID[l]), hModule, SND_RESOURCE | SND_ASYNC );
                 Sleep(ZweiSilbenP[l]);
                 i+=2;
                 } 
              }
            }
            for(int m = 0;m < 72;m++) 
            { 
              if (m_Flag==1) {
                 CString strEineStelle  = strText.Mid(i, +1); 
                 if(strcmp(strEineStelle,EineStelleSilbe[m]) == 0) 
                 { 
                 ::PlaySound(MAKEINTRESOURCE(EineSilbeID[m]), hModule, SND_RESOURCE | SND_ASYNC );
                 Sleep(EineSilbeP[m]);
                 }
              } 
            }
        } 
            if ((i==0) || (i=strText.GetLength())){
            m_pWnd->SendMessage(WM_USER_MESSAGE); 
            }
    
    }
    

    am ende der for schleife wird die Message WM_USER_MESSAGE an meine Anwendung verschickt, die dort auch ankommt. Sie sagt der Anwendung das der Satz gesprochen wurde und das die Speek Buttens wieder aktiviert werden sollen.

    Das funktioniert auch bei der Debug Version der Testaplikation wunderbar. Nur wenn ich in der Release Version der Anwendung die Funktion OnStopspeek() das zweite mal ausführe stürzt das Programm ab. Der Debuger sagt dann:

    void* CMapPtrToPtr::GetValueAt(void* key) const
    // find value (or return NULL -- NULL values not different as a result)
    {
        if (m_pHashTable == NULL)
            return NULL;
    
        UINT nHash = HashKey(key) % m_nHashTableSize;
    
        // see if it exists
        CAssoc* pAssoc;
        for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
        {
            if (pAssoc->key == key)
                return pAssoc->value;
        }
        return NULL;
    }
    

    woraus ich nicht schlau werde.

    Kann mir irgendjemand helfen da ich nicht verstehe wo das Problem ist.



  • Hallo,

    ich bin durch zufall auf ein anderes Forum gestoßen, wo jemand das Problem geschildert hat.

    Hallo,
    ich mach das immer so:
    Nachricht senden:
    Code:

    #define WM_MYMESSAGE WM_APP+1
    ...
    SendMessage(hWnd,WM_MYMESSAG,0,0);

    Klassse mit dem Handler:
    Code:

    ON_MESSAGE(WM_MYMESSAG, OnMyMessage)
    ...
    //Messagehandler
    afx_msg CMyClazz::OnMyMessage(LPARAM lParam, WPARAM wParam)
    {

    }

    Es ist wichtig dass der Messagehandler so deklariert ist, lässt man den Modifier afx_msg weg funzt es zwar in der Debugversion aber die Release wird abstürzen und man sucht sich zu Tode,

    also ist vieleicht was für die Faq da man ohne das afx_msg sich zu tode sucht wie ich am eigenen Leib erfahren habe.

    Das könnte man ja vieleicht dem nächsten ersparen.

    [ Dieser Beitrag wurde am 27.02.2003 um 00:41 Uhr von asmodia editiert. ]



  • hmm, aber irgendwie ist afx_msg nur ein Platzhalter. Jedenfalls in der MFC von Visual C++ 6 und 7.

    // Type modifier for message handlers
    #ifndef afx_msg
    #define afx_msg         // intentional placeholder
    #endif
    

    In einer Newsgroup hab ich gerade gelesen:

    I remember reading about the afx_msg sometime ago. It is a macro that they
    stick in for future source compatibility. When they decide not to use
    message maps but virual functions instead they will define afx_msg as
    'virtual' ie:
    #define afx_msg virtual
    but right now it is:
    #deifne afx_msg
    So it has no effect on the code.

    [ Dieser Beitrag wurde am 27.02.2003 um 00:48 Uhr von Trolli editiert. ]



  • Hallo Trolli,

    es funktionierte vorher definitiv nicht mit der Release Verion!
    und nun durch das afx_msg funktioniert die Release Version.

    Hier ist der Link wo ich das her habe:
    [url] http://www.programmierer-board.de/phpBB2/viewtopic.php?t=30201&highlight=release [/url]

    aber wieso das so ist kann ich auch nicht sagen, ich weis nur das etwas in der Debug Version ignoriert wird weslhalb die Debug Version ohne Probleme läuft, nur eben nicht in der Release Version.



  • Hi,
    hört sich aber mysteriös an. :p
    Normalerweise dürfte sich durch diese leere Anweisung nichts ändern. Kann aber auch nur Zufall sein, dass es plötzlich funktioniert. 😉

    Guck auch mal hier, vielleicht hat es damit zu tun:
    Debug Assertion failed bei delete

    [ Dieser Beitrag wurde am 27.02.2003 um 01:28 Uhr von Trolli editiert. ]



  • Hallo,

    ich will hier nicht ein auf oberklug machen, da ich wohl am wehnigsten
    Ahnung in C++ habe vom ganzen Forum hier.

    Ich habe es nochmal getestet ohne afx_msg stürzt meine Release Version ab. Mit nicht.

    Zufall oder nicht, ich bin froh das es jetzt damit funktioniert 🙂


Anmelden zum Antworten