2015-07-20 19 views
0

我已經以下代碼:如何將參數傳遞給`_T()`?

CString port = m_HOST_PORT.GetString(); 

ShellExecute(NULL, NULL, _T("cmd.exe"), 
    _T("/k \"C:\\Program Files\\Java\\jre1.8.0_45\\bin\\java\" -cp C:\\Users\\foobar\\workspace\\IEC60870\\bin main.CApp %s", 
    (LPCTSTR)(port)), SW_SHOWNORMAL); 

當運行該代碼段碼(一小部分從一個更大的代碼),則該命令提示窗口出現用以下文本:未知:%S 。顯然,_T("%s", (LPCTSTR)(port))不起作用,或者我不知道如何以正確的方式使用它。

如何將參數(LPCTSTR)(port)傳遞給_T()

P.S:

手工鍵入它,如:

ShellExecute(NULL, NULL, _T("cmd.exe"), 
    _T("/k \"C:\\Program Files\\Java\\jre1.8.0_45\\bin\\java\" -cp C:\\Users\\foobar\\workspace\\IEC60870\\bin main.CApp 4711"), 
    SW_SHOWNORMAL); 

將在這裏工作。

+0

'_T()'只是一個與字符字面序列一起工作的宏。我很確定你的問題是重複的。 –

+0

你應該得到一個「太多的實際參數」警告宏使用。 – molbdnilo

回答

2

_T()不是一個函數,它是一個擴展爲無或爲L的宏,具體取決於是否定義了unicode宏; here on MSDN

如果定義了unicode(_UNICODEUNICODE),那麼;

_T("hello world"); 

成爲

L"hello world"; 

否則它只是"hello world";

要使用普通的printf樣式格式,只需用sprintfsnprintf;根據unicode宏,支持_T()的相應宏是_stprintf,它將爲sprintfswprintf。對於明確的緩衝區大小控制,您可以使用_sntprintf


使用示例(緩衝區溢出等未考慮);

TCHAR buffer[1024] = {}; // make sure the buffer is large enough 
TCHAR format[] = _T("/k \"C:\\Program Files\\Java\\jre1.8.0_45\\bin\\java\" -cp C:\\Users\\foobar\\workspace\\IEC60870\\bin main.CApp %s"); 
::_stprintf(buffer, format, (LPCTSTR)(port)); 
ShellExecute(NULL, NULL, _T("cmd.exe"), 
    buffer, SW_SHOWNORMAL); 
+0

@ager沒有問題。 '(LPCTSTR)(port)'很好。它將轉換爲ANSI版本的'LPCSTR'和UNICODE版本的'LPCWSTR'。 –