如何为以下场景进行类型转换?

时间:2009-07-24 06:13:44

标签: c++ visual-c++

我正在使用

TCHAR缓冲区[MAX_SIZE];

经过一些步骤后,我知道文件夹的相对路径为ex:

C:\ Microsoft.NET \框架\ v1.0.037 \

由于上面的路径是在TCHAR类型的缓冲区中,我正在尝试连接“RegAsm.exe”

追加后我需要将路径转换为LPCTSTR,因为我需要将其传递给 CreateProcess(),它将LPCTSTR类型作为参数

然后编译器给出了错误。我尝试过但很烦恼。

任何人都可以在这方面帮助我......

5 个答案:

答案 0 :(得分:2)

_tcscat_s

是TCHAR的相关方法。它取决于_UNICODE&上的TCHAR。 _MBCS预处理器swithch将被解析为strcat_s或wcscat_s。

TCHAR buffer[MAX_SIZE] = _T("c:\Microsoft.NET\Framework\v1.0.037\");
_tcscat_s(buffer, MAX_SIZE, _T("RegAsm.exe"));

但这是非常好的旧C风格。因此,当您使用TCHAR时,我会建议 你也使用MFC的东西。因此使用CString也会受到_UNICODE& _MBCS也可以解决您的问题。

CString buffer;
buffer = _T("c:\Microsoft.NET\Framework\v1.0.037\");
buffer += _T("RegAsm.exe");
CreateProcess(buffer, ..

std :: string或std :: wstring无济于事,因为它们不会改变与切换预处理器相关的行为,但如果使用CreateProcessA或CreateProcessW,也可以使用std :: string或std :: wstring。

答案 1 :(得分:1)

问题是TCHAR和CreateProcess是根据您是否为Unicode编译而不同扩展的宏。需要注意的是,GetCORSystemDirectory()只接受Unicode缓冲区。要摆脱这些ANSI / Unicode问题,请为Unicode明确编写此代码部分。

而不是TCHAR使用WCHAR作为缓冲区。而不是CreateProcess()使用CreateProcessW() - 它将很乐意接受Unicode缓冲区。使用wcscat()进行字符串连接。

这样的事情(省略错误处理):

 WCHAR buffer[MAX_PATH + 1];
 DWORD realLength;
 GetCORSystemDirectory( buffer, MAX_PATH, &realLength );
 *( buffer + realLength ) = 0;// Don't forget to null-terminate the string
 wcscat( buffer, L"regasm.exe" );
 CreateProcessW( /*pass buffer here*/ );

答案 2 :(得分:0)

如果你想让你的生活更轻松我总是建议使用std :: string,那么当调用CreateProcess()函数时,只需:

std::string myPath = "somePath";
LPCTSTR lpBuf = reinterpret_cast<LPCTSTR>(myPath.c_str());

没有经过测试,但这应该可行,如果您仍然收到错误,那么发布代码将非常有用。

请注意,如果使用Unicode,可能会更复杂。

答案 3 :(得分:0)

我假设你得到一个错误,你正在使用Unicode ...在这种情况下你可能想看看 mbstowcs wcstombs 功能

确实需要更多信息才能正确回答。

答案 4 :(得分:0)

当你做缓冲区+“RegAsm.exe”时,它就像添加两个指针一样(当数组衰减成指针而“RegAsm.exe”将是const TCHAR *)因此你得到编译器错误。你想要的是字符串连接。使用_tcscat或安全版本(如MSDN中所声明的)_tcscat_s函数进行连接。