tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
788
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dolphon Dolphon ist offline Mitglied Brokat
    Registriert seit
    Jun 2003
    Beiträge
    308
    Hi,

    ich habe folgenden Code, der in einem anderem Projekt ohne Probleme funktioniert. Nur in dem neuen Projekt nicht:

    Folgende Fehlermeldungen erhalte ich:

    Code :
    1
    2
    3
    
    Error   2   error C2664: 'StringCchCopyNW' : cannot convert parameter 1 from 'char [500]' to 'STRSAFE_LPWSTR'   
    Error   3   error C2664: 'StringCchVPrintfW' : cannot convert parameter 1 from 'char' to 'STRSAFE_LPWSTR'
    Error   4   error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'char [500]' to 'LPCWSTR'



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    #define MAX_TRACE_LINE_LEN 500
    const char DEBUG_PREFIX[] = "XXXXXX: ";
    const int DEBUG_PREFIX_LEN = strlen(DEBUG_PREFIX); 
     
    void PrintTraceF(__in char* formatStr, ...)
    {
        va_list args;
        va_start( args, formatStr); 
        PrintTraceWithArgs(formatStr,args);
        va_end(args);
    }
     
    void PrintTraceWithArgs(__in char* formatStr, va_list& args)
    {
        char szFormatedStr[MAX_TRACE_LINE_LEN];
     
        size_t cchDebugPrefix = sizeof(DEBUG_PREFIX) / sizeof(DEBUG_PREFIX[0]);
        StringCchCopyN(szFormatedStr, MAX_TRACE_LINE_LEN, DEBUG_PREFIX, cchDebugPrefix);
        StringCchVPrintf(&szFormatedStr[DEBUG_PREFIX_LEN],
                         MAX_TRACE_LINE_LEN-1-DEBUG_PREFIX_LEN,
                         formatStr,
                         args);
        // Ensure NULL termination in case of long strings
        szFormatedStr[MAX_TRACE_LINE_LEN-1] = '\0'; 
     
        OutputDebugString(szFormatedStr);
    }

    Aufgerufen wird das ganze über z.B. "DBGTRACEF(("Failed on " #exp ", hr=%08x\n",hr)); "
    Mittels define wird dann das passende aufgerufen:

    Code :
    1
    2
    
    #define DBGTRACE(exp) PrintTraceF(exp)
    #define DBGTRACEF(multiexp) PrintTraceF multiexp
    Geändert von Dolphon (13.10.09 um 10:30 Uhr)
     
    Leg dich mit dem Besten an, und stirb wie alle dann******

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Du hast die UNICODE oder MBCS Unterstützung eingeschaltet und "const char[]" kann nunmal nicht in "const wchar_t*" konvertiert werden.

    Entweder du schaltest auf den ANSI Zeichensatz um, oder du definierst es so:
    Code c:
    1
    2
    3
    4
    5
    6
    
    const TCHAR DEBUG_PREFIX[] = TEXT("XXXXXX: ");
    const size_t DEBUG_PREFIX_LEN = _tcslen(DEBUG_PREFIX);
     
    ...
    TCHAR szFormatedStr[MAX_TRACE_LINE_LEN];
    size_t cchDebugPrefix = DEBUG_PREFIX_LEN;
    Gruß

    PS: Beachte, das du noch Platz für das \0 Zeichen brauchst.
    Geändert von deepthroat (13.10.09 um 10:34 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Dolphon Dolphon ist offline Mitglied Brokat
    Registriert seit
    Jun 2003
    Beiträge
    308
    Besten Dank für deine Hilfe.

    Das Projekt stand auf Unicode und das andere ist im MBCS Format.
    Umgestellt und siehe da es funktioniert.

    Wenn ich deine Definition nehme, dann muss noch

    Code :
    1
    
    char* formatStr

    geändert werden. Sonst klappt es nicht.
     
    Leg dich mit dem Besten an, und stirb wie alle dann******

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Dolphon Beitrag anzeigen
    Wenn ich deine Definition nehme, dann muss noch

    Code :
    1
    
    char* formatStr

    geändert werden. Sonst klappt es nicht.
    Ja, ich weiß. Du solltest es grundsätzlich mit TCHAR und den generischen Funktionen arbeiten. Dann kannst du beliebig zwischen ANSI und UNICODE umstellen.

    Beachte das deine Funktion für MBCS nicht korrekt definiert ist.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 20.11.07, 17:59
  2. Antworten: 0
    Letzter Beitrag: 22.11.05, 16:31
  3. convert
    Von DJBUNDI im Forum Linux & Unix
    Antworten: 3
    Letzter Beitrag: 21.10.04, 11:57
  4. cannot convert parameter 1 from 'CStringArray' to 'CStringArray'
    Von SittingDuck im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 26.05.04, 10:58
  5. MAC/PC convert?
    Von teene im Forum Sonstige Grafik-Programme
    Antworten: 7
    Letzter Beitrag: 28.01.02, 22:46