将GetCurrentDirectory与wcstombs一起使用

时间:2017-11-19 09:30:37

标签: c windows winapi tchar

我从collegaue那里得到了一段时间以前编写的代码,令人困惑。 代码是:

TCHAR Curr_dir[100];  
char* input_file;  
DWORD a = GetCurrentDirectory(100, Curr_dir);  
size_t i= wcstombs(&input_file[i], Curr_dir, 100);

问题是Curr_dir不是wcstombs所需的类型。 是否有任何其他函数可以执行wcstombs对此类变量的处理? 或者转换它的方法?

1 个答案:

答案 0 :(得分:0)

看起来你有一个曾经支持多字节和UNICODE的代码,但在停止编译为多字节(不再支持Windows 95)之后就已经衰减了。

只有定义了_UNICODE时,此代码剪断才有意义。在这种情况下,它在预处理器之后就像这样结束:

wchar_t Curr_dir[100];  
char* input_file;  
unsigned long a = GetCurrentDirectoryW(100, Curr_dir);  
size_t i= wcstombs(&input_file[i], Curr_dir, 100);

在这种情况下,GetCurrentDirectoryWCurr_dir中返回UINCODE(宽字符串),并且由于某种原因,它被转换为多字节字符串。并且字符的类型匹配。

但如果_UNICODE 定义,则代码会更改为以下内容:

char Curr_dir[100];  
char* input_file;  
unsigned long a = GetCurrentDirectoryA(100, Curr_dir);  
size_t i= wcstombs(&input_file[i], Curr_dir, 100);

GetCurrentDirectoryA现在切换到ANSI version of the API,再调用wcstombs毫无意义。

通常MDSN文档的一个部分包含一个表,其中包含通用文本例程映射下所有版本的字符串函数(例如strcmp-wcscmp-mbscmp)没有' _t& #39; wcstombs的版本,因此您需要使用#ifdef _UNICODE

但即使可能仍然支持Win32 API的多字节版本,继续使用它们也没有意义。

更多:https://www.codeproject.com/articles/76252/what-are-tchar-wchar-lpstr-lpwstr-lpctstr-etc