Как я преобразовываю из _TCHAR * для обугливания * при использовании переменной длины C++ args?

Расчетные прыжки в середине легитимного вида, но на самом деле скрывающие настоящие инструкции - мои любимые. В любом случае, их довольно легко обнаружить людям, но автоматизированные инструменты часто портят это.

Кроме того, замена обратного адреса в стеке - хорошая трата времени.

8
задан Nick Bolton 23 October 2009 в 12:49
поделиться

4 ответа

Используйте% hs или% hS вместо% s. Это заставит параметры интерпретироваться как char * в версиях функций printf () как в Ansi, так и в Unicode, например:

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); 
}
3
ответ дан 5 December 2019 в 22:19
поделиться

Обычно это выглядит так:

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

Ваш вопрос не совсем ясен. Как реализована ваша функция и как вы ее используете?

2
ответ дан 5 December 2019 в 22:19
поделиться

это то, что я использовал раньше для преобразования TCHAR в char, надеюсь, это поможет, хотя я на самом деле не искал оптимизации, так что это не самый быстрый способ .. но он работал!

    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
ответ дан 5 December 2019 в 22:19
поделиться

Вот мое решение - приветствую предложения по улучшению!

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
}
1
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: