我试图通过使用注册表在C中列出启动程序

时间:2015-07-11 23:52:09

标签: c windows

我是C的初学者,我想创建一个列出Windows中所有启动程序的程序..

我想通过打开寄存器可以做到这一点 所以我打开了寄存器。     ret = RegOpenKeyEx (HKEY_LOCAL_MACHINE , TEXT ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_QUERY_VALUE, &hKey);

并阅读 ret = RegQueryValueEx (hKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, &d_type, (LPBYTE)d_buffer, &d_byte );

我的问题是如何从这些注册表中获取字符串(程序名称)? 当我试图制作一个char arr []时,由于这个错误,我一直在挣扎;并将值移入其中。

所以也许我做错了什么......我应该使用指针还是什么?

有人能给我一些线索吗? 感谢

2 个答案:

答案 0 :(得分:0)

RegQueryValueEx (hKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, &d_type, (LPBYTE)d_buffer, &d_byte );

RegQueryValueEx仅在您事先知道值的名称时才有效。

RegQueryValueEx (hKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), "SmartAudio", &d_type, (LPBYTE)d_buffer, &d_byte );

如果Smart Audio名称有值,则会打印数据。但如果您不知道有价值的名称,那么您可以使用

int main()
{
  system("C:\\Windows\\system32\\reg.exe QUERY HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run");
} 

它会为您提供这样的输出 - enter image description here

答案 1 :(得分:0)

流程如下:
1)打开注册表项(寄存器是完全不同的东西)
2)询问密钥有多少个注册表值 3)迭代它们并获取它们的数据(这是你要找的)

此代码段获取keyHandle,枚举值,并将数据输入缓冲区中

DWORD numberOfValues;
LONG result = RegQueryInfoKey(
    keyHandle,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    &numberOfValues,
    NULL,
    NULL,
    NULL,
    NULL);

wchar_t valueName [300];
DWORD bufferSize;

for (DWORD i = 0; i<numberOfValues; i++){
    bufferSize = 300;
    LONG result = RegEnumValue(
        keyHandle,
        i,
        valueName,
        &bufferSize,
        0,
        nullptr,
        nullptr,
        &bufferSize);
    if (result == ERROR_SUCCESS){
        valueName[bufferSize] = 0;
        //do something with valueName, this is the name of the program

    }
}

注意:此程序假定您将程序定义为Unicode程序。 (你应该,因为你不能真正想到所有的程序名都会以纯英文命名) 注意2:我确实认识到你学习C语言,这是一种开头的语言,但使用C ++或C#这项任务要容易得多。记住以后的任务。