尝试使用Windows/C++读取注册表值的奇怪错误

问题描述:

我正在尝试读取应用程序的安装路径,而我对我所得到的行为感到莫名其妙。首先,这里没有工作(格式化它一点,所以它不会占用一个巨大的线)的代码:尝试使用Windows/C++读取注册表值的奇怪错误

LONG status = RegQueryValueEx(
    hkRegistry, 
    "InstallPath", 
    0, 
    &regType, (LPBYTE)installPath, 
    &regSize); 
if (status == ERROR_SUCCESS) { 
    // Handle success. 
} 

我意识到,这是失败的呼叫RegQueryValueEx,所以我决定通过增加一个例外内把它扔探测返回值:

else { 
    throw Exception(status); 
} 

但后来......代码开始工作,并调用RegQueryValueEx成功。只要我在else内投掷,我就可以重复此行为。如果我注释掉else的主体,错误将会返回。

编辑︰好吧,我试着打电话MessageBox而不是一个例外,我得到了同样的行为。如果我将它评论出来,它会再次停止工作。

这是否有一个合理的解释?

+0

你能否提供一些更多的信息,比如所有变量的声明(或者最好甚至是所谓的整个函数)?我可以想象这是一种堆栈溢出问题,其症状根据编译器如何根据函数的其余部分决定布局堆栈而有所不同。 – Sven

+0

我意识到可能发生了什么事,我回到了这里,并确认了它(奇怪的是,我的问题总是如此)。当我终于明白其行为'正确'并向我显示'RegQueryValueEx'错误时,它是'ERROR_MORE_DATA',所以可能发生的情况是,由于缓冲区太小,有一定的堆栈布局,这意味着溢出到其他堆栈元素,但是当我改变代码时,它们之间存在差距,所以它不能这样做。我现在在乌托邦;你可以回复这些信息,我会接受它。 – Jengerer

+0

*只是溢出,即 – Jengerer

regSize(必须初始化为缓冲区大小)中包含的值相比,installPath的缓冲区可能太小。

如果installPath是堆栈分配值,我怀疑它溢出,导致status的值被覆盖。