【问题标题】:Error: argument of type char* is incompatible with parameter of type LPCWSTR错误:char* 类型的参数与 LPCWSTR 类型的参数不兼容
【发布时间】:2011-07-04 06:49:19
【问题描述】:
#include <windows.h>
#include <iostream>
using namespace std;
int main() {
char* file="d:/tester";
WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
hFind = FindFirstFile(file, &FindFileData);  // line of error says argument of type char* is incompatible with parameter of type LPCWSTR
}

我无法理解错误。它是什么以及如何解决错误?

我正在制作一个控制台应用程序,需要检查目录中是否有文件。

【问题讨论】:

  • 你试过(LPCWSTR)(&amp;FindFileData)(或任何C++风格的演员)吗?
  • 在不使用参考的情况下是否会给您带来错误? (文件,FindFileData)
  • @iammilind 是的,它在像这样投射后可以工作:(LPCWSTR)file 但是什么是 LPCWSTR
  • @iammilind:你真的要把char*转换成LPCWSTR吗?
  • @sharptooth,几年前我在学习 VC++ GUI 时,在很多文章中都看到过这样的转换。事实上,事情就是这样发生的。我现在不记得我在哪里看到的了。但它是无害的。

标签: c++ visual-c++


【解决方案1】:

LPCWSTR 类型是指向宽字符的 const 指针

char* file="d:/tester"; 中的file 是一个指向普通字符的指针

普通字符通常使用 1 个字节的内存,而宽字符通常使用 2 个字节。如果文件名包含西里尔字母或日文字母会怎样?如果不指定编码,您将无法打开它。 Windows API 接受 FindFirstFile 函数的宽字符,因为文件名可以是 unicode。因此,如果您编写L"foo_bar",编译器会将其解释为宽字符串。所以你可以写wchar_t* file = L"d:\\tester";来匹配参数类型,这样编译就会成功。

【讨论】:

    【解决方案2】:

    您正在调用需要宽字符串 (FindFirstFileW) 的函数。您要么更改文件以使用wchar_t* file = L"d:\\tester";,要么使用函数FindFirstFileA 的ASCII 版本。

    【讨论】:

    • 是的,它有效。但我不明白我做了什么。请你详细说明你的答案。
    • 当 Windows 添加对 Unicode 的支持时,他们决定为许多函数创建两个版本,最后以 W 和 A 结尾,因此函数名称根据 Unicode 设置映射到其中一个。
    【解决方案3】:

    您正在使用定义的 UNICODE 进行编译,但将 ANSI 字符串作为您的第一个参数传递。将beings char *替换为

    TCHAR *file=TEXT("d:\tester");

    一切都会好起来的。

    马丁

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多