我目前正在尝试为泛型函数构建特定于平台的实现,并且我在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定义看起来很好(aka。unsigned long int)。
那个普通的int来自哪里?我对这些错误非常非常困惑......
有没有人对可能导致此问题的原因以及如何解决这个问题有所了解?
有问题的端口使用以下内容: 目标系统:Windows XP 32 /编译器:mingw32-gcc-g ++ 4.8.1-4 /编译器选项:-pedantic-errors -Wall -Werror -Wextra -std = c ++ 11
谢谢!
答案 0 :(得分:3)
它抱怨第四个论点REG_SZ
。
您传递的是您期望的类型的值。但是该函数要求您传递一个接收实际类型的缓冲区。
lpType [out, optional]
指向变量的指针,该变量接收指示存储在指定值中的数据类型的代码。有关可能的类型代码的列表,请参阅注册表值类型。如果不需要类型代码,
lpType
参数可以是NULL
。
所以你需要这样的东西:
DWORD dwActualType;
RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, &dwActualType, (LPBYTE) buffer, &buffersz);
if (dwActualType == REG_SZ) ...