在视觉工作室之外运行时的行为不同

时间:2014-07-21 07:18:58

标签: visual-studio-2010 winapi stack calling-convention

我对以下代码的行为感到惊讶:

if(RegQueryValueEx(....)!=ERROR_SUCCESS){
...
}

当它从visual studio运行时它没有输入这个if块,因为密钥确实存在。当在visual studio环境之外运行时,它评估为true并因此进入块,即使查询的密钥存在。经过一些测试后,我发现当我第一次将它保存到一个变量时,它运行总是很好。使用以下代码:

HKEY hSoftwareKey,hAppKey;
DWORD dwLength;
int iStatus=1;
char szBuffer[MAX_PATH];
if(iStatus&&RegOpenKeyA(HKEY_CURRENT_USER,"Software",&hSoftwareKey)!=ERROR_SUCCESS)
    iStatus = 0;
if(iStatus&&RegCreateKeyA(hSoftwareKey,"Amine",&hAppKey)!=ERROR_SUCCESS){
    iStatus = 0;
}

ZeroMemory(szBuffer,MAX_PATH);
LONG lRet;
lRet = RegQueryValueExA(hAppKey,"One",0,0,reinterpret_cast<LPBYTE>(szBuffer),&dwLength);

这个bevavior是否与__stdcall / WINAPI调用约定有关?如果是这样,请有人解释原因

1 个答案:

答案 0 :(得分:3)

在调用RegQueryValueEx()之前,您需要将dwLength初始化为MAX_PATH,否则它的值是未定义的。

来自MSDN RegQueryValueEx

  

lpcbData是一个指向变量的指针,该变量指定lpData参数指向的缓冲区大小(以字节为单位)。函数返回时,此变量包含复制到lpData

的数据的大小