none
messagebox geht nicht? RRS feed

  • Frage

  • Hallo,

     

    wieso geht diese messagebox nicht mehr zu Kompilieren:

     

    #define WIN32_LEAN_AND_MEAN 
    #include <Windows.h> 
    
    int WINAPI WinMain(HINSTANCE hInstance,  
    	        HINSTANCE hPrevInstance,
    				  LPSTR lpCmdLine,    
    				  int nCmdShow)     
    {
    	
    	 MessageBox( 0 ,             
    		    "test",          
    				"Titelbeschriftung",    
    				MB_OK | MB_ICONEXCLAMATION);
    	return 0;
    }
    

    Fehlermeldung:

     

    1>------ Erstellen gestartet: Projekt: 1_projekt, Konfiguration: Debug Win32 ------
    1> main.cpp
    1>c:\users\meiko\documents\visual studio 2010\projects\1_projekt\1_projekt\main.cpp(13): error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [5]' in 'LPCWSTR' nicht möglich
    1>     Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    
    gruß Meiko

    Mittwoch, 5. Januar 2011 10:07

Antworten

  • Weil Du Dich noch nicht mit TCHAR beschäftigt hast und kein _T makro verwendest...

    Korrekt wäre:

    MessageBox(0, _T("test"), _T("Titelbeschriftung"), MB_OK |
    MB_ICONEXCLAMATION);

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 5. Januar 2011 10:25
  • > Warum muss das _T davor??

    Weil Du ein Unicode Projekt hast und
    1. Eine Funktion MessageBox nicht existiert. Sondern nur ein Makro
    2. Der Makro MessageBox ersetzt MessageBox durch MessageBoxA bzw. MessageBoxW.
    3. MessageBoxA ist die "ANSI" Variante die Strings als char* annimmt.
    4. MessageBoxW ist die "UNICODE" Variante die Strings als wchar_* annimmt.
    5. Ob MessageBoxA oder MessageBoxW verwendet wird entscheidet sich anhand der Projekteinstellungen (General)
    6. _T ist ein Makro, der eine Stringkonsante "Text" bei einem Unicode Projekt in L"Text" umwandelt und bei nicht Unicode Projekten die Konstante unverändert lässt.
    7. Entsprechend ist TCHAR als char bzw. wchar_t definiert je nach Projekteinstellung.
    8. Durch Verwendung der _T Notation kann man Projkete so schreiben, dass Sie sowohl für Unicode als auch für MBCS funktionieren.

    Dein dev Compiler hat offensichtlich immer nur "ANSI" Projekte gehabt und die entsprechenden Einstellungen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 10:55
  • Ich habe Dir dies expilizit bereits beschrieben in meinem Posting um 11:55.

    Regeln:
    Kein A und W anhängen und_T für Konstanten verwenden.
    Char Arrays als TCHAR deklarieren!

    Wenn Du die MSDN Samples durchschaust wirst Du genau auf die entsprechenden Beispiele, die Du suchst stoßen.
    Die MSDN Samples verwenden eigentlich meistens die TCHAR Notation!
    Dito, wenn Du einfach ein WinAPI-Windows Projekt mit dem Wizard anlegst.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 15:18

Alle Antworten

  • Weil Du Dich noch nicht mit TCHAR beschäftigt hast und kein _T makro verwendest...

    Korrekt wäre:

    MessageBox(0, _T("test"), _T("Titelbeschriftung"), MB_OK |
    MB_ICONEXCLAMATION);

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 5. Januar 2011 10:25
  • Hi Jochen,

    das kannte ich noch nicht. Beim dev compiler ging es ohne _T davor.

    Bin neu bei Visuall c++ 2010 kenne da noch nicht die Feinheiten das Buch was ich durcharbeite

    kennt das _T nicht "Alexander Rudolf 3D Spiele mit C++ und DirectX"

    es ist aber für Visuall c++.

     

    Warum muss das _T davor??

    gruß

     

    Mittwoch, 5. Januar 2011 10:47
  • Hab es gerade mal ausprobiert es geht immer noch nicht jetzt kommt diese Meldung:

     

    1>------ Erstellen gestartet: Projekt: 1_projekt, Konfiguration: Debug Win32 ------
    1>  main.cpp
    1>c:\users\meiko\documents\visual studio 2010\projects\1_projekt\1_projekt\main.cpp(10): error C3861: "_T": Bezeichner wurde nicht gefunden.
    1>c:\users\meiko\documents\visual studio 2010\projects\1_projekt\1_projekt\main.cpp(10): error C3861: "_T": Bezeichner wurde nicht gefunden.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Mittwoch, 5. Januar 2011 10:52
  • > Warum muss das _T davor??

    Weil Du ein Unicode Projekt hast und
    1. Eine Funktion MessageBox nicht existiert. Sondern nur ein Makro
    2. Der Makro MessageBox ersetzt MessageBox durch MessageBoxA bzw. MessageBoxW.
    3. MessageBoxA ist die "ANSI" Variante die Strings als char* annimmt.
    4. MessageBoxW ist die "UNICODE" Variante die Strings als wchar_* annimmt.
    5. Ob MessageBoxA oder MessageBoxW verwendet wird entscheidet sich anhand der Projekteinstellungen (General)
    6. _T ist ein Makro, der eine Stringkonsante "Text" bei einem Unicode Projekt in L"Text" umwandelt und bei nicht Unicode Projekten die Konstante unverändert lässt.
    7. Entsprechend ist TCHAR als char bzw. wchar_t definiert je nach Projekteinstellung.
    8. Durch Verwendung der _T Notation kann man Projkete so schreiben, dass Sie sowohl für Unicode als auch für MBCS funktionieren.

    Dein dev Compiler hat offensichtlich immer nur "ANSI" Projekte gehabt und die entsprechenden Einstellungen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 10:55
  • Ich habe jetzt folgendes ausprobiert:

     

    Neues Projekt erstellt: VisualC++ Win32-Projekt

    dann die Anwendungseinstellungen auf:  Windows-Anwendung und Leeres Projekt.

    dort habe ich eine Datei in Quelldatein erstellt und main.cpp genannt.

    Dann habe ich den Quelltext abgeändert und versucht es auszuführen:

     

    #define WIN32_LEAN_AND_MEAN
    #include <Windows.h>

    int WINAPI WinMain(HINSTANCE hInstance, 
                HINSTANCE hPrevInstance,
                      LPSTR lpCmdLine,   
                      int nCmdShow)    
    {
       
        MessageBoxA(0, _T("test"), _T("Titelbeschriftung"), MB_OK | MB_ICONEXCLAMATION);

        return 0;
    }

    Fehlermeldung:

     

    1>------ Erstellen gestartet: Projekt: test5, Konfiguration: Debug Win32 ------
    1>  main.cpp
    1>c:\users\meiko\documents\visual studio 2010\projects\test5\test5\main.cpp(10): error C3861: "_T": Bezeichner wurde nicht gefunden.
    1>c:\users\meiko\documents\visual studio 2010\projects\test5\test5\main.cpp(10): error C3861: "_T": Bezeichner wurde nicht gefunden.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    ging es nicht aber wenn ich es so schreibe:

    #define WIN32_LEAN_AND_MEAN
    #include <Windows.h>

    int WINAPI WinMain(HINSTANCE hInstance, 
                HINSTANCE hPrevInstance,
                      LPSTR lpCmdLine,   
                      int nCmdShow)    
    {
       
        MessageBoxA(0, "test", "Titelbeschriftung", MB_OK | MB_ICONEXCLAMATION);

        return 0;
    }

     

    im Debugger kommen diese Meldungen:

     

    "test5.exe": "C:\Windows\SysWOW64\ntdll.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\kernel32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\KernelBase.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\user32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\gdi32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\lpk.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\usp10.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\msvcrt.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\advapi32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\sechost.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\rpcrt4.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\sspicli.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\cryptbase.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\msvcr100d.dll" geladen, Symbole wurden geladen.
    "test5.exe": "C:\Windows\SysWOW64\imm32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\msctf.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\uxtheme.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\dwmapi.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\ole32.dll" geladen, Cannot find or open the PDB file
    "test5.exe": "C:\Windows\SysWOW64\oleaut32.dll" geladen, Cannot find or open the PDB file
    Das Programm "[6628] test5.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.

     

    aber es geht.

     

    Mittwoch, 5. Januar 2011 11:24
  • 1. _T Notation kommt durch den header tchar.h, den Du nicht eingefügt hast. In reinen Windows API Projekten erledigt der Makro TEXT, das gleiche.
    2.
     > [cpp]

        MessageBoxA(0, _T("test"), _T("Titelbeschriftung"), MB_OK | MB_ICONEXCLAMATION);

    > [/cpp]

    ist falsch weil doppelt gemoppelt.
    Wenn Du MessageBoxA direkt verwendest, dann kannst Du auch _T weglassen.
    3. Ich würde Dir nicht raten, die A/W Varianten direkt zu verwenden.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 12:06
  • // 3. Ich würde Dir nicht raten, die A/W Varianten direkt zu verwenden.

    bei  "CreateWindowEx" ist das gleiche Problem wenn ich ein A hinten dran schreibe geht es wieder ohne nicht gleiche

    Probleme wie oben.

    Wie Schreibe ich es richtig mit _T ? Hast du ein Beispiel woran ich mich Orientieren kann?

    In meinem Buch steht weder was vom _T noch vom A. Kann ich Visuall c++ so einstellen das es wie

    der dev compiler Arbeitet? Es würde das durcharbeiten von meinen Buch sehr erleichtern.

    Mittwoch, 5. Januar 2011 12:27
  • Ich habe Dir dies expilizit bereits beschrieben in meinem Posting um 11:55.

    Regeln:
    Kein A und W anhängen und_T für Konstanten verwenden.
    Char Arrays als TCHAR deklarieren!

    Wenn Du die MSDN Samples durchschaust wirst Du genau auf die entsprechenden Beispiele, die Du suchst stoßen.
    Die MSDN Samples verwenden eigentlich meistens die TCHAR Notation!
    Dito, wenn Du einfach ein WinAPI-Windows Projekt mit dem Wizard anlegst.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 15:18