Как использовать переменную внутри оболочки _T? - PullRequest
1 голос
/ 23 декабря 2010

Я хочу сделать имя хоста частью этой строки переменной. В настоящее время это только исправление для этого URL:

_T(" --url=http://www.myurl.com/ --out=c:\\current.png");

Я хочу сделать что-то подобное, чтобы URL можно было менять.

_T(" --url=http://www." + myurl +  "/ --out=c:\\current.png");

обновление. Ниже моя последняя попытка:

      CString one   = _T(" --url=http://www.");
      CString two(url->bstrVal);
      CString three = _T("/ --out=c:\\current.png");
      CString full = one + two + three;

      ShellExecute(0,                           
               _T("open"),        // Operation to perform
               _T("c:\\IECapt"),  // Application name
               _T(full),// Additional parameters
               0,                           // Default directory
               SW_HIDE);

Ошибка: Ошибка 1, ошибка C2065: «Lfull»: необъявленный идентификатор c: \ test.cpp

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

Не работает, потому что макрос _T() работает только с строковыми литералами constant .Определение для _T() выглядит примерно так:

#ifdef UNICODE
#define _T(str) L##str
#else
#define _T(str) str

Поскольку вы, очевидно, компилируете в режиме Unicode, _T(full) расширяется до Lfull, что, очевидно, не то, что вам нужно.

В вашем случае просто введите full без макроса _T(), поскольку CString определяет оператор преобразования в const wchar_t* в режиме Unicode и const char* в режиме не в Unicode.

ShellExecute(0, _T("open"), _T("c:\\IECapt"), full, 0, SW_HIDE);

Обратите внимание, что стандартный C ++ также предоставляет тип std::string и тип std::wstring, который выполняет почти то же, что и CString, поэтому MFC фактически не требуется для манипулирования строками.std::string не не предоставляет оператор преобразования, но предоставляет доступ к базовой строке в стиле C через c_str().

2 голосов
/ 23 декабря 2010

Ваша последняя попытка сработает, если вы потеряете _T () примерно на «полный» при вызове ShellExecute.CString вернет правильный указатель.Работа выполнена.

Кроме того, хотя ... Вы должны просто полностью потерять _T ().Если вы собираетесь делать такие вещи, как ссылка url-> bstrVal напрямую (то есть Unicode, независимо от того, для чего вы компилируете), тогда ваш код будет работать только как Unicode.

В наши дни больше нет особых причин для компиляции одного и того же проекта для Unicode и ANSI.Материал _T () был создан для того, чтобы «легко» обращаться к обоим режимам.Но если вы не нацелены на Win95 / 98 / ME, вы можете просто перейти на Unicode и очистить свой код.Юникод тоже быстрее, потому что Windows API и Ядро внутренне Юникод.Все API-интерфейсы ANSI сначала преобразуют строковые параметры в Unicode, а затем вызывают их коллегу с широкими символами.

Поэтому нет _T, TCHAR и т. Д. Вместо этого используйте такие вещи:

PWSTR psz = L"my unicode string";
CString s = L"my other string, yay!";
1 голос
/ 23 декабря 2010

В дополнение к тому, что сказал In silico, CString :: Format делает этот код намного более читабельным:

CString full;
full.Format(_T(" --url=http://www.%s/ --out=c:\\current.png"), url->bstrVal));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...