我想让这个字符串的主机名部分变量。 目前,只修复此网址:
_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
答案 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));