以下段是较大文件中较大功能的一部分。我把它缩减到了我认为解释当前问题的基本要素。
我正在使用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"
谢谢!
答案 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