Simple Ausgabe wird zu herausforderung.



  • Hallo,

    Am Anfang wollte ich einen Besipielcode für eine "Prozessansicht", doch was bei VC++ 6 noch ein einfach Spiel ist, wird bei VC++2005 anscheinend zu einer herausforderung, oder ich bin einfach nur zu ....

    Den Beispielcode hatte ich schnell in der MSDN gefunden und in ein neues Projekt eingefügt. Doch bei der Compilierung des Beispielcodes von MS gab es schon einige Compilererrors - Typcast errors. Diese Fehler behob ich, doch die Programmausgabe hat danach nicht mehr gestimmt - es wurde immer nur das erste Zeichen ausgeben.

    PROCESSENTRY32 pe32

    typedef struct tagPROCESSENTRY32 {
    DWORD dwSize;
    DWORD cntUsage;
    DWORD th32ProcessID;
    ULONG_PTR th32DefaultHeapID;
    DWORD th32ModuleID;
    DWORD cntThreads;
    DWORD th32ParentProcessID;
    LONG pcPriClassBase;
    DWORD dwFlags;
    TCHAR szExeFile[MAX_PATH];
    } PROCESSENTRY32

    Ich möchte die Varibale szExeFile ausgeben, aber printf und cout geben mir immer nur das erste Zeichen aus.

    typedef WCHAR TCHAR;
    Also ist TCHAR = WHAR

    In der MSDN hab ich dann eine funktion zur Ausgabe von UNICODE gefunden:
    wprintf.

    Doch Gebe ich den TCHAR string als parameter an, bekomme ich folgende Meldung:

    error C2664: 'wprintf' : cannot convert parameter 1 from 'const char [10]' to 'const wchar_t *'

    Anscheinend ist der "TCHAR szExeFile[MAX_PATH];" string ein 'const char [10]' !?!?!

    Wenn ich den string nun Byteweise ausgebe geht es , aber dafür muss es doch auch eine FUnktion geben, um "WCHAR" bzw "TCHAR" Strings auszugeben.



  • Eigentlich sollte das ganz normal gehen, indem du von der Struktur auf szExeFile zugreifst. Wie stellst du es denn an? Und wo willst du es überhaupt ausgeben (MessageBox, Konsole, normales Fenster, Edit-Box)?

    BTW: Ein TCHAR ist wenn die Konstante UNICODE bzw. _UNICODE nicht definiert ist ein CHAR...



  • auf der Console....

    in VC++ 6 ging es Fehlerfrei mit : printf( "\nPROCESS NAME: %s", pe32.szExeFile );

    Aber in VC++ 8.0 wird nur der erste buchstaben ausgegeben.

    mit: cout << pe32.szExeFile << endl;
    wird nur die Adresse ausgegeben.

    und mit: cout << (char 😉 pe32.szExeFile << endl;
    gibt er nur das erste Zeichen aus.



  • So klappt es bei mir:

    #include <iostream>
    #include <windows.h>
    #include <tlhelp32.h>
    using namespace std;
    
    int main()
    {
    	PROCESSENTRY32 proc;
    	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    	proc.dwSize = sizeof(proc);
    
    	Process32First(hSnapshot,&proc);
    
    	while(Process32Next(hSnapshot,&proc))
    		wprintf(L"%s \n",proc.szExeFile);
    
    	return 0;
    }
    


  • tatsache...
    aber da ist doch auch wieder nen Wiedersprch drin.
    Denn _UNICODE wurde ja nicht definiert, d.h das ist ein normaler Char-String.
    Aber du gibt ihn mit wprintg aus.

    Und was hat eigentlich das "L" zu sagen? (wprintf(L"%s \n",proc.szExeFile))

    Ist das nen Typcastmakro?



  • Ich gehe davon aus, dass UNICODE standardmäßig definiert ist.

    Wenn man nicht sicher ist, kann man _tprintf() mit TCHAR benutzen.

    Das L bedeuted, dass der folgende String ein UNICODE-String ist, man kann aber hier auch TEXT(" ") oder _T(" ") verwenden.


Anmelden zum Antworten