如何在_T包装器中使用变量?

时间:2010-12-23 02:05:45

标签: c++ visual-c++ mfc

我想让这个字符串的主机名部分变量。 目前,只修复此网址:

_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 个答案:

答案 0 :(得分:3)

它不起作用,因为_T()宏仅适用于常量字符串文字。 _T()的定义如下所示:

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

由于您显然是在Unicode模式下进行编译,_T(full)会扩展为Lfull,这显然不是您想要的。

在您的情况下,只需在没有full宏的情况下传递_T(),因为CString在Unicode模式下将转换运算符定义为const wchar_t*const char*在非Unicode模式下。

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

请注意,标准C ++还提供std::string类型和std::wstring类型,它几乎完成了CString的操作,因此字符串操作实际上不需要MFC。 std::string 提供转化运算符,但确实通过c_str()提供对基础C风格字符串的访问权。

答案 1 :(得分:2)

如果您在ShellExecute调用中从“full”周围丢失_T(),则您的最新尝试将起作用。 CString将返回正确的指针。完成工作。

此外,虽然......你应该完全失去_T()的东西。如果您要直接参考url-> bstrVal(这是Unicode,无论您正在编译什么),那么您的代码将只能用作Unicode。

现在再也没有理由为Unicode和ANSI编译同一个项目了。创建了_T()内容以“轻松”解决这两种模式。但除非您的目标是Win95 / 98 / ME,否则您可以使用Unicode并清理代码。 Unicode也更快,因为Windows API和内核在内部是Unicode。所有ANSI API首先将字符串参数转换为Unicode,然后调用它们的wide-char对应物。

所以没有_T,TCHAR等。请改用这样的东西:

PWSTR psz = L"my unicode string";
CString s = L"my other string, yay!";

答案 2 :(得分:1)

除了In silico所说的,CString :: Format使这段代码更具可读性:

CString full;
full.Format(_T(" --url=http://www.%s/ --out=c:\\current.png"), url->bstrVal));