ReportEvent Parameter LPCTSTR *lpStrings richtig "casten" ?



  • Hallo

    Ich verwende die Funktion ReportEvent. Aber ich versteh da etwas nicht ganz so recht.

    Ich verwende es so:

    char errorMessage[800];
    ...
    ...

    ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*)&errorMessage[0], NULL);

    Einfach so
    ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0,"Mein Text", NULL);

    geht wohl nicht. Bzw wird gar nich kompiliert.

    Allerdings scheint auch oben ein Fehler zu sein.
    Und zwar ein Konevteirungsfehler ... Nur weiß ich nicht wie ich das richtig machen soll ?
    Im Eventlog steht aber der Text nicht, sondern ein Kryptisches Zeichen.
    Was mache ich da denn Falsch ? Irgendwie ist mir nicht ganz klar wie ich konvertieren oder casten muss. ?

    Grüße



  • char errorMessage[800];
    

    ...
    ...

    ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*)&errorMessage[0], NULL);
    

    Das wird so nix, probier mal:

    LPCTSTR errorMessage[1];
    TCHAR bla[1000] = _T("bla");
    *errorMessage = bla;
    ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, errorMessage, NULL);
    

    Außerdem empfehle ich dir, sobald du mit Strings unter Windows hantierst,
    genau darauf zu achten, ob du Unicode machst oder nicht.

    Ich selber habe Unicode (auch im prof. Umfeld) noch nie wirklich gebraucht,
    und setze auf Multibyte 😉

    also etwa in der Form:

    #undef UNICODE
    #undef _UNICODE
    
    #include <windows.h>
    //#include <tchar.h>
    

    zumal bei Multibyte LPTSTR/LPCTSTR auf die C/C++ konformen Typen
    (const) char* gemappt sind, also auch folgender "richtiger" weil
    standardkonformer Code ohne das ganze Unicodeextragedöns und auch ohne CString möglich wäre:

    const char *errorMessage[1];
    char bla[1000];
    *errorMessage=strcpy(bla,"bla");
    ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, errorMessage, NULL);
    


  • Hi

    Also ganz verstehe ich das sowieso noch nicht. Ich hab das jetzt mal so versucht
    aber ich habe genau das selbe Resultat wie bei meiner Variante. Diese kryptische Zeichen. "\ôž"

    Ich verstehe auch nicht wieso ich jetzt aufeinmal einen TCHAR nutzen soll.
    In meinem Fall wird nämlich auf
    #define ReportEvent ReportEventA

    ReportEventA gemappt.(Ok konntest du nicht wissen)
    Somit meine ich das ein char das erledigen sollte. ?? Oder nicht ?


  • Mod

    Also nochmal:
    1. Sollst Du einen Array von Zeigern auf LPCSTR übergeben und keinen LPCTSTR Zeiger.
    2. Wenn Du nicht explizit ReportEventA nutzt solltest Du auch bei der TCHAR Notation bleiben!

    const TCHAR bla[] = _T("bla");
    LPCTSTR errorMessage[1] { bla };
    ReportEvent(..., _countof(errorMessage),...,errorMessage,...);
    


  • Achso hmm ok jetzt verstehe ich was gemeint war. Danke das du das noch mal betont hast :).
    Dann muss ich vielleicht doch nochmal das ganze was ich vor habe beschreiben.
    Dachte ich versuche nur so wenig wie möglich zu fragen ...

    Also ich versuche mittels GetLastError den Fehler zu bekommen dann mittels FormatMessage
    Den dazugehörigen Fehlertext. Und danach möchte ich diesen Fehlertext ind das EventLog schreiben.

    FormatMessage verlangt aber einen LPSTR. Damit bekomm ich dann zwar den Text. Aber jetzt weißc ich nicht
    wie und wo ich das oder was ich überhaupt tun muss damit ReportEvent mit diesem Text was anfangen kann.
    LPSTR ist doch ein Pointer auch einen "char" ... Daher hab ich im Test auch einen "char" genommen.
    Aber ReportEvent verlangt wieder was ganz anderes. Und das ist mir noch nicht ganz so klar ?

    Also so in etwa ...

    GetLastError()
    FormatMessage()
    
    // und hier passiert das Wunder :) 
    
    ReportEvent()
    

    Gibts vielleicht auch wo ein Seite wo man mal nachlesen kann was dieses ganze LPCSTR,LPCTSTR, etc erklährt wird?
    Die Namen sind echt ungünstig weil sie so ähnlich sind. Weil ich hab dazu noch nicht so wirklich was einfaches
    gefunden ...


Anmelden zum Antworten