如何在C++;? 我是C++的新手,试图从VisualC++ 6中的ReGysz类型的注册表项中获取字符串值。公平地说,我是我的深度和我认为我错过了一些相当明显的东西 string FindRegistryValue(){ string location; LONG lResult; LPBYTE installLocation; LPDWORD bufferSize= (unsigned long*)8192; lResult = RegQueryValueEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\1234\\uninstallString", NULL, NULL, installLocation, bufferSize); location = *installLocation; return location; }
但在调用RegQueryValueEx的过程中,它会编译并发出访问冲突。任何帮助都将不胜感激:)而不是:如何在C++;? 我是C++的新手,试图从VisualC++ 6中的ReGysz类型的注册表项中获取字符串值。公平地说,我是我的深度和我认为我错过了一些相当明显的东西 string FindRegistryValue(){ string location; LONG lResult; LPBYTE installLocation; LPDWORD bufferSize= (unsigned long*)8192; lResult = RegQueryValueEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\1234\\uninstallString", NULL, NULL, installLocation, bufferSize); location = *installLocation; return location; },c++,visual-c++,registry,C++,Visual C++,Registry,但在调用RegQueryValueEx的过程中,它会编译并发出访问冲突。任何帮助都将不胜感激:)而不是: LPBYTE installLocation; LPDWORD bufferSize = (unsigned long*)8192; 它应该是: BYTE installLocation[8192]; DWORD bufferSize = sizeof installLocation; 然后在RegQueryValueEx调用中将bufferSize更改为&bufferSize 此外,返
LPBYTE installLocation;
LPDWORD bufferSize = (unsigned long*)8192;
它应该是:
BYTE installLocation[8192];
DWORD bufferSize = sizeof installLocation;
然后在RegQueryValueEx
调用中将bufferSize
更改为&bufferSize
此外,返回的数据不保证以null结尾。所以你也需要处理这个问题:
if (bufferSize && !installLocation[bufferSize - 1])
--bufferSize;
return string(installLocation, bufferSize);
另一方面,该值通常以null结尾,因为这是
REG_SZ
的文档格式,大多数人都遵循这种格式。您可以检查installLocation[bufferSize-1]
处的字符是否为空,如果为空,则在调用string(installLocation,bufferSize)
之前减小bufferSize
。或者用于保证installLocation
以null结尾。@RemyLebeau事实上,如果OP可以使用的话,我同意只使用RegGetValue
。只需知道RegGetValue()
在XP SP2和更早版本上不可用。但是,对于SP2,您可以使用。当然,现在XPSP3和/或Vista必须是最低基线:-还有一个问题。对于if块,为什么它将bufferSize和installLocation视为布尔值?空值的检查是如何终止的?出于某种原因,此代码正在输出外观有趣的“ÌÌÌÌÌÌÌÌÌÌ”符号。