How do I convert from _TCHAR * to char * when using C++ variable-length args?

前端 未结 4 1420
情话喂你
情话喂你 2021-01-12 05:53

We need to pass a format _TCHAR * string, and a number of char * strings into a function with variable-length args:

inline void FooBar(const _TCHAR *szFmt,          


        
相关标签:
4条回答
  • 2021-01-12 06:13

    Use %hs or %hS instead of %s. That will force the parameters to be interpretted as char* in both Ansi and Unicode versions of printf()-style functions, ie:

    inline void LogToFile(const _TCHAR *szFmt, ...)
    {  
      va_list args;
      TCHAR szBuf[BUFFER_MED_SIZE];
    
      va_start(args, szFmt);
      _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
      va_end(args);
    }  
    
    {
      char *foo = "foo"; 
      char *bar = "bar"; 
      LogToFile(_T("Test %hs %hs"), foo, bar); 
    }
    
    0 讨论(0)
  • 2021-01-12 06:13

    Here was my solution - I welcome suggestions for improvement!

    inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) {
    
        va_list args;
        _TCHAR szBuf[BUFFER_MED_SIZE];
    
        // Count the number of arguments in the format string.
        const _TCHAR *at = _tcschr(szFmt, '%');
        int argCount = 0;
        while(at) {
            argCount++;
            at = _tcschr(at + 1, '%');
        }
    
        CA2W *ca2wArr[100];
        LPWSTR szArgs[100];
        va_start(args, cArgs);
        for (int i = 1; i < argCount + 1; i++) {
            CA2W *ca2w = new CA2W(cArgs);
            szArgs[i] = ca2w->m_psz;
            ca2wArr[i] = ca2w;
            cArgs = va_arg(args, const char *);
        }
        va_end(args);
    
        // Use the new array we just created (skips over first element).
        va_start(args, szArgs[0]);
        _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
        va_end(args);
    
        // Free up memory used by CA2W objects.
        for (int i = 1; i < argCount + 1; i++) {
            delete ca2wArr[i];
        }
    
        // ... snip ... - code that uses szBuf
    }
    
    0 讨论(0)
  • 2021-01-12 06:27

    Usually it looks like the following:

    char *foo = "foo";
    char *bar = "bar";
    #ifdef UNICODE
    LogToFileW( L"Test %S %S", foo, bar); // big S
    #else
    LogToFileA( "Test %s %s", foo, bar);
    #endif
    

    Your question is not completely clear. How your function is implemented and how do you use it?

    0 讨论(0)
  • 2021-01-12 06:30

    this is something I have used before to convert a TCHAR to char, hope it helps, although I wasn't really looking for optimization, so it's not the fastest way.. but it worked!

        TCHAR tmp[255];
    ::GetWindowText(hwnd, tmp, 255);
    std::wstring s = tmp;
    
    //convert from wchar to char
    const wchar_t* wstr = s.c_str();
    size_t wlen = wcslen(wstr) + 1;
    char newchar[100];
    size_t convertedChars = 0;
    wcstombs_s(&convertedChars, newchar, wlen, wstr, _TRUNCATE);
    
    0 讨论(0)
提交回复
热议问题