【问题标题】:DWORD to LPDWORD conversion errorsDWORD 到 LPDWORD 转换错误
【发布时间】: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 的自定义定义。这正是让我困惑的地方。

标签: windows c++11 mingw32


【解决方案1】:

它在抱怨第四个参数REG_SZ。

您正在传递您期望的类型的值。但是这个函数需要你传递一个接收实际类型的缓冲区。

lpType [out, optional]

指向变量的指针,该变量接收指示存储在指定值中的数据类型的代码。有关可能的类型代码的列表,请参阅注册表值类型。如果不需要类型代码,lpType 参数可以是NULL。

所以你需要这样的东西:

DWORD dwActualType;

RegQueryValueEx(key, TEXT(BSPS_FACONF_REGKEYNAME), NULL, &dwActualType, (LPBYTE) buffer, &buffersz);
if (dwActualType == REG_SZ) ...

【讨论】:

  • 谢谢!由于错误消息中的列排名,我非常专注于 lpcbData,以至于我完全忘记检查 lpType。我在这个术语上设置的临时更正现在运行良好。非常感谢。
  • @MTBSdevs:是的,这看起来很奇怪。但是当那个参数看起来没问题时,我检查了文档页面,发现总共三个LPDWORD类型的参数。为什么小 ^ 出现在错误的位置是个谜,我想这可能是“制表符与空格”问题,或者与您正在使用的几个宏的扩展大小有关(我在那条线上数了五个) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多