gpt4 book ai didi

c++ - 如何在 Visual C++ 中正确调用 CopyFile 函数?

转载 作者:行者123 更新时间:2023-11-30 00:53:48 24 4
gpt4 key购买 nike

我有一个将两个 CHAR* 作为输入的函数。 int _stdcall FileTrans(char* InFile, char* OutFile) 在 DLL 项目中。

在函数中,我只是在一些过程(与文件无关)之后调用 CopyFile(InFile, OutFile, false);。但它说它需要两个输入作为 LPCWSTR。我用 Google 搜索了它,但找不到任何非常有趣的东西。

最佳答案

像所有接受字符串参数的 Windows API 函数一样,CopyFile 函数实际上有两种变体:

  • CopyFileA 是 ANSI 版本,它采用系统默认字符集中的(非 Unicode)字符串。基本上,它接受 const char* 类型的参数,但 Windows header 使用 typedef LPCSTR为此。

  • CopyFileW 是宽版本,它采用 Unicode 字符串。为此,它接受 w_char* 类型的参数。 ,但 Windows header 使用 typedef LPCWSTR为此(请注意 typedef 中额外的 W)。

然后,取决于是否UNICODE预处理器宏是为您的项目定义的(在包含 Windows header 之前的代码中,或者在 Visual Studio 中的项目属性中),Windows header 将未修饰的 CopyFile 定义为 CopyFileA 或 CopyFileW。自然地,如果 UNICODE定义后,CopyFile 将被定义为 Unicode 版本的 CopyFileW。否则,它将被定义为 CopyFileA。这个想法是对通用 CopyFile 函数的调用在编译时自动解析为正确的变体。

当然,既然您了解了所有这些内容,您基本上就可以忘记它了。在现代 Windows 编程中,完全没有理由调用旧的 ANSI 版本的函数或处理窄字符串。算了吧char*甚至可以用作字符串类型——那些字符串对你来说是死的。从现在开始您将要使用的唯一字符串是 Unicode 字符串,由 wchar_t 组成人物。因此 UNICODE符号应该总是为你的代码定义,你应该只使用W Windows API 函数的版本。

再次查看 CopyFileW 函数的原型(prototype)(与调用定义了 UNICODE 的 CopyFile 时得到的原型(prototype)相同),我们看到:

BOOL WINAPI CopyFile(LPCWSTR lpExistingFileName,
LPCWSTR lpNewFileName,
BOOL bFailIfExists);

回想一下你在上面学到的 LPCWSTR只是 const wchar_t* 的 typedef 同义词,由宽字符组成的 C 风格字符串。你已经知道为什么参数被标记为const : 因为该函数不会修改这些值。

并且因为您在上面还了解到这些是您应该再使用的唯一类型的字符串,下一步是修改您的 FileTrans 函数以接受宽字符串(如果不打算修改它们,则将它们设为 const他们):

int _stdcall FileTrans(const wchar_t* InFile, const wchar_t* OutFile);

现在,从 FileTrans 内部,您可以毫无问题地调用 CopyFile,因为您拥有正确的字符串类型。


但有一点免费的额外建议:永远不要在 C++ 中使用原始的 C 风格字符串。始终使用在 std 中定义的 C++ 字符串类命名空间由 <string>标题。

这个类有两个常见的变体,std::stringstd::wstring .和以前一样,w指的是宽字符串,这是您希望在 Windows 中使用的唯一类型。所以std::wstringCHAR* 的新替代品吗?整个代码库。

将 FileTrans 函数的声明更改为如下所示:

#include <string>

// ...some other stuff...

int __stdcall FileTrans(const std::wstring& InFile, const std::wstring& OutFile);

请注意,我已经更改了您的原始 CHAR*std::wstring 常量引用的参数对象。常量引用在这里工作得很好,因为您不会在函数内部更改这些值中的任何一个。

如果您不清楚常量的含义、如何使用引用或类类型在 C++ 中的一般工作方式,请咨询您的 favorite C++ book )——这是所有 C++ 程序员都需要的知识。请记住,C++ 与 C 不是同一种语言,因此不适用相同的习语。在许多情况下,有更好的方法来做事,这当然是这种情况的一个例子。

关于c++ - 如何在 Visual C++ 中正确调用 CopyFile 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com