【发布时间】:2014-11-11 12:48:48
【问题描述】:
我目前正在尝试为通用函数构建特定于平台的实现,但在 WIN32 版本上出现奇怪的编译错误。 这个函数很简单:它提供了应用程序配置文件的路径,Windows 版本逻辑上应该从注册表键中获取。
该函数的当前实现如下所示:
#include <windows.h>
#include <memory>
#include <exception>
#include "../../common/bserrors.h"
#include "bsplatformsettings.h"
#include "bsplatformimpl.h"
std::string bsConfigFileAccessorImpl::ProvideFile() {
HKEY key = 0;
DWORD buffersz;
std::string result;
// Open registry key
if (RegOpenKey(BSPS_FA_REGKEYGROUP, TEXT(BSPS_FA_REGKEYPATH), &key) != ERROR_SUCCESS) {
throw bsError(bsErrcode::BSEC_INVALID_CONFIG_ACCESS, BSPS_FA_REGKEYPATH);
}
// Get the configuration file path
if (RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, REG_SZ, NULL, &buffersz) != ERROR_SUCCESS) {
RegCloseKey(key);
throw bsError(bsErrcode::BSEC_INVALID_CONFIG_ACCESS, BSPS_FACONF_REGKEYNAME);
} else {
char * buffer = new char[(size_t) buffersz];
RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, REG_SZ, (LPBYTE) buffer, &buffersz);
result = std::string(buffer);
delete(buffer);
}
RegCloseKey(key);
return result;
}
但是,当我尝试编译该版本时,我遇到了令人费解的错误:
platform/win32/bsplatformimpl.cpp: In member function 'virtual std::string bs::bsConfigFileAccessorImpl::ProvideFile()':
platform/win32/bsplatformimpl.cpp:228:87: error: invalid conversion from 'int' to 'LPDWORD {aka long unsigned int*}' [-fpermissive]
if (RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, REG_SZ, NULL, &buffersz) != ERROR_SUCCESS) {
^
platform/win32/bsplatformimpl.cpp:233:95: error: invalid conversion from 'int' to 'LPDWORD {aka long unsigned int*}' [-fpermissive]
RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, REG_SZ, (LPBYTE) buffer, &buffersz);
^
看起来在编译时呈现的 DWORD 定义不是我们所期望的。但是我没有在任何地方定义任何自定义 DWORD 定义,并且 windows.h 中的 DWORD 定义看起来很好(又名 unsigned long int)。
那么这个普通的 int 是从哪里来的呢?我对这些错误感到非常非常困惑......
是否有人对可能导致此问题的原因以及如何解决此问题有所了解?
有问题的端口使用以下内容: 目标系统:windows XP 32 / 编译器:mingw32-gcc-g++ 4.8.1-4 / 编译器选项:-pedantic-errors -Wall -Werror -Wextra -std=c++11
谢谢!!
【问题讨论】:
-
'int' to 'LPDWORD {aka long unsigned int*}' 表示您正在尝试将整数类型转换为指针。
-
您确定问题中显示的代码是您实际尝试编译的代码吗?您是否在自己的头文件中(或在非系统库头文件中)对
DWORD进行了重新定义? -
我在任何地方都没有任何 DWORD 的自定义定义。这正是让我困惑的地方。