2015-09-12 51 views
0

[VS10]其目的是驱动文字串复制到* .DST从而wcscpy不接受TCHAR在目标变量

TCHAR *driveIDBase; 
... 
wcscpy_s (driveIDBase, MAX_PATH-3, L"\\\\?\\C:\\*"); 

这将产生错误

智能感知:没有实例重载函数“wcscpy_s”的匹配 参数列表

注意,ANSI版本的作品不够好:

strcpy_s (driveIDBase, MAX_PATH-3, "C:\\*"); 

假设我们尝试了明显的解决方法:

strcpy_s(driveIDBase,MAX_PATH-3, “\\。\ C:?\”);

我们可以通过调用(wchar_t *)驱动IDBase可靠吗?也就是说,WIN32_FIND_DATAW会将该字符串解释为“C:\”?

MSDN也是什么意思?

的 “\\。\?” 前缀关闭路径字符串的自动扩展,

+0

适合我的工作(VS2015)。 'TCHAR'取决于项目中的字符集选择。它是否设置为Unicode? –

+0

@Bo它是MBCS。嘿,改为Unicode会在代码中产生大量“不兼容”的类型错误 - 我想看看这个。在这里有2015年的ISO。值得一试? –

+1

VS2015在这里不会改变任何东西。根据该设置,“TCHAR”可以是“char”或“wchar_t”。如果你编写新的软件,你可以使用wchar_t并跳过TCHAR thingy。这是为了简化为Windows 95和Windows NT编写代码而引入的。不是我们现在做的事情。 –

回答

0

值得注意TCHAR的堆栈溢出定义:

#define指令的任char或wchar_t,用于移植古代的windows应用程序。

正在组装的代码不是一个古老的端口,尽管将它包含在当前项目中的原因是为了在某些API函数中进行转换而推荐使用它(在较老的线程中)。
由于MBCS的逐步淘汰,现在建立一个项目在Unicode中比上面提到的更适合使用Unicode,这使得TCHAR宏的使用变得多余。
至于问题的第二部分,假设一个宽字符目录由此产生:

%USERPROFILE%\This Is A SubDirectory of %USERPROFILE% Not C-Colon-Backslash-Users-Backslash-MyUserName-- Being the Expanded Directory Path We Intended to Use 

我们注意到,在\\。\给定的子目录将不会在“C创建:\用户\ MyUserName输入”。事实上,它在大多数情况下不可能,因为在第一个例子中C:\ Users永远不会被创建带有\\?\前缀。

总结答案,这部分与另一个问题:
关于从MSDN同一页面其中规定另一份声明:

的32,767个字符的最大路径是近似的,因为 ” \\。\ “前缀可以由系统在运行时间 可以扩展到更长的串,并且该膨胀适用于总长度,

是在运行时不自动膨胀?