C++创建文件映射对象时GENERIC_READ报too many initializer values错误
问题原因及解决方案
你遇到的编译错误和GENERIC_READ参数本身无关,是代码语法错误导致的:你尝试接收CreateFileAPI返回值的写法不符合C++语法,被编译器错误识别为函数声明。
你写的HANDLE CreateFile(开头的代码段,编译器会解析为「声明一个返回HANDLE类型、名为CreateFile的函数」,但你括号内填写的都是调用API的实参值,不是函数声明要求的参数类型列表,完全不符合语法规范,因此抛出类型不匹配、初始化参数过多的错误,这也是你修改参数值、替换CreateFileA都无法解决问题的原因。
修复方案
将代码修改为「定义变量+赋值接收API返回值」的格式,你需要给接收句柄的变量起一个独立名称(不要和API名CreateFile重名),示例如下:
// 定义名为hFile的HANDLE变量,接收CreateFileW的返回值 HANDLE hFile = CreateFileW( L"filename.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
补充注意事项
- 调用
CreateFile类API后,必须通过返回值是否为INVALID_HANDLE_VALUE判断调用是否成功,不要用NULL判断,API执行失败时返回的是INVALID_HANDLE_VALUE而非空指针 - 文件句柄使用完毕后,必须调用
CloseHandle(hFile)释放资源,避免句柄泄漏 - 如果你代码中使用了
L前缀的宽字符文件名,明确调用CreateFileW可以避免不同编译环境下UNICODE宏未定义导致的类型不匹配问题
内容的提问来源于stack exchange,提问作者Handge
相关产品推荐
相关产品推荐

