2010-06-20 18 views
5

Tôi đã có một vấn đề về RegOpenKeyEx, mã:RegOpenKeyEx trở ERROR_SUCCESS nhưng nó không nên (windows 7)

#include <tchar.h> 
#include <stdio.h> 
#include <windows.h> 

#pragma comment (lib, "Advapi32.lib") 


int main() { 
    TCHAR *keyName = _T("SOFTWARE\\foobar2000\\capabilities"); 
    HKEY key = NULL; 
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) { 
     printf("open key failed!\n"); 
     return -1; 
    } else { 
      printf("open key success!\n"); 
    } 

    TCHAR *value = _T("123"); 
    if (RegSetValueEx(key, _T("xxx"), 0, REG_SZ, 
      (const BYTE *)value, sizeof(TCHAR) * (_tcslen(value) + 1)) != ERROR_SUCCESS) { 
     printf("set value failed!\n"); 
    } 
    RegCloseKey(key); 
    return 0; 
} 

Lưu mã trong như reg.cpp, và trong chế độ lệnh:

cl reg.cpp

và tôi đã nhận reg.exe, chạy nó:

D: \ tmp> reg.exe

thành công chính mở!

Nhưng giá trị chưa được ghi trong sổ đăng ký.

Một điều kỳ lạ nữa là nếu tôi sử dụng studio trực quan để tạo dự án CLI và dán mã vào chính(), RegOpenKeyEx() sẽ trả về false.

Nền tảng là Windows 7 và UAC được bật.

Trả lời

5

Có vẻ như bạn đang chạy vào ảo hóa. NẾU ứng dụng không có tệp kê khai, khi bạn cố gắng ghi vào HKLM \ Software, nó thực sự ghi vào HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software. Để ngăn chặn điều này, bạn có thể chạy ứng dụng được nâng lên. Bạn có thể muốn thêm tệp kê khai buộc nó phải chạy lên cao mỗi lần. Ngoài ra, hãy ngừng ghi vào HKLM và sử dụng HKCU thay thế.

Đối với phần C++/CLI, dự đoán của tôi sẽ là bạn được cung cấp tệp kê khai asInvoker cho tệp đó, ngăn chặn ảo hóa và kết quả trong nỗ lực gặp lỗi HKLM.

Các vấn đề liên quan