DWORD到LPDWORD转换错误

时间:2014-11-11 12:48:49

标签: windows c++11 mingw32

我目前正在尝试为泛型函数构建特定于平台的实现,并且我在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

谢谢!

1 个答案:

答案 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) ...