警告C4229:使用的时间错误:忽略数据上的修饰符

时间:2011-08-27 11:30:50

标签: visual-studio-2010 winapi

以下段是较大文件中较大功能的一部分。我把它缩减到了我认为解释当前问题的基本要素。

我正在使用Visual Studio 2010。

调用RegConnectRegistryA的行导致编译器警告我:“警告C4229:使用了时间错误:数据的修饰符被忽略”。这是编译器输出中唯一的警告或错误。构建成功,可执行文件按预期运行。但我确实想摆脱那个警告。 (说实话,我认为已存在好几个月了。)

extern "C" __declspec(dllexport) void whoOpsRegistryGetREG_SZ(
    LPCSTR szServer, 
    LPCSTR szKey, 
    LPCSTR szValue, 
    char* szReturn, 
    int iSize) 
{
    HKEY hKey;
    LONG WINAPI lReturn = ::RegConnectRegistryA(
        szServer, 
        HKEY_LOCAL_MACHINE, 
        &hKey);
}

我在其他帖子中读到的内容让我相信它与#includes有某种关联。所以他们在这里。如果你需要引号中任何头文件的内容,请告诉我。

#include "stdafx.h"
#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <objidl.h>
#include <wchar.h>
#include <stdio.h>
#include <stdarg.h>
#include <lm.h>
#include "whoOpsPrivate.h"
#include "whoOps.h"
#include "jni.h"
#include "whoOps_TaskScheduler.h"
#include "whoOps_ServiceMangler.h"
#include "whoOps_RegistryRaptor.h"
#include "../../cyclOps.h"

谢谢!

3 个答案:

答案 0 :(得分:4)

在我看来,问题是WINAPI实际上是一个调用约定(IIRC,它结果是stdcall)所以将它应用于变量{{}的声明是没有意义的。 1}}。我没有便于测试的Windows开发环境,但我强烈怀疑如果您删除lResult,警告就会消失。

答案 1 :(得分:3)

这很可能是因为您将WINAPI放在lReturn的变量声明上。 WINAPI扩展为__stdcall,它指定了函数调用约定,并且 little 对变量声明没有任何意义。

答案 2 :(得分:1)

警告上的MSDN page表示在数据声明中使用Microsoft修饰符是一种过时/不合时宜的做法。如果正在使用Microsoft数据修饰符来修改该特定行的内容,我最好的猜测是它隐藏在LONG或WINAPI宏中。

我自己并不熟悉Windows API,所以我不能说经验,但......显然,WINAPI宏是defined as __stdcall in windef.h。除非你在没有事故的情况下在其他地方调用了相同的宏,否则我敢打赌那是你的罪魁祸首。

NM,被两个人殴打。 :P