首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

注册表操作的一个有关问题

2013-11-11 
注册表操作的一个问题LRESULT OnCreate(HWND hWnd, LPCREATESTRUCT /* pCreateStruct */){HKEY hKey nul

注册表操作的一个问题

LRESULT OnCreate(HWND hWnd, LPCREATESTRUCT /* pCreateStruct */)
{
HKEY hKey = nullptr;
DWORD dwDisposition = 0;

//LSTATUS Ret = 0;

if (::RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey,
0,
nullptr, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, nullptr,
&hKey, &dwDisposition))
{
}
else
{
}


if (REG_CREATED_NEW_KEY == dwDisposition)
{
// 如果这个键是创建出来的(以前不存在),那么不进行操作
}
if (REG_OPENED_EXISTING_KEY == dwDisposition)
{
// 如果这个键是已经存在的,那么读出其中的值

DWORD ValueType[4] = {};
DWORD ValueData[4] = {};
DWORD cbValueData[4] = {};
::RegQueryValueEx(hKey, L"left", nullptr, &ValueType[0], (BYTE*)&ValueData[0], &cbValueData[0]);
::RegQueryValueEx(hKey, L"top", nullptr, &ValueType[1], (BYTE*)&ValueData[1], &cbValueData[1]);
::RegQueryValueEx(hKey, L"right", nullptr, &ValueType[2], (BYTE*)&ValueData[2], &cbValueData[2]);
::RegQueryValueEx(hKey, L"bottom", nullptr, &ValueType[3], (BYTE*)&ValueData[3], &cbValueData[3]);

int left = ValueData[0];
int top = ValueData[1];
int right = ValueData[2];
int bottom = ValueData[3];
TCHAR szMsg[100] = {};
wsprintf(szMsg, L"%d %d %d %d", left, top, right, bottom);
::MessageBox(nullptr, szMsg, L"窗口尺寸", MB_OK);
//::SetWindowPos(hWnd, nullptr, left, top, right, bottom, SWP_SHOWWINDOW);
//::SetWindowPos(hWnd, nullptr, left, top, right - left, bottom - top, SWP_SHOWWINDOW);
}

return 0;
}

我在注册表编辑器中能看到这些键的值(都不是零),但MessageBox显示的结果却是4个0 注册表
[解决办法]
::RegQueryValueEx(hKey, L"bottom", nullptr, &ValueType[3], (BYTE*)&ValueData[3], &cbValueData[3]);红色参数为输出缓存区大小,其值应该要初始化
[解决办法]
试试下面的修改,另外单步调试可以很清楚的看出问题。

DWORD ValueLen[4] = {};
::RegQueryValueEx(hKey, L"left", nullptr, &ValueType[0], (BYTE*)&ValueData[0], &cbValueLen[0]);


引用:
LRESULT OnCreate(HWND hWnd, LPCREATESTRUCT /* pCreateStruct */)
{
HKEY hKey = nullptr;
DWORD dwDisposition = 0;

//LSTATUS Ret = 0;

if (::RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey,
0,
nullptr, REG_OPTION_NON_VOLATILE, KEY_WRITE 
[解决办法]
 KEY_READ, nullptr,
&hKey, &dwDisposition))
{
}
else
{
}


if (REG_CREATED_NEW_KEY == dwDisposition)
{
// 如果这个键是创建出来的(以前不存在),那么不进行操作
}
if (REG_OPENED_EXISTING_KEY == dwDisposition)
{
// 如果这个键是已经存在的,那么读出其中的值

DWORD ValueType[4] = {};
DWORD ValueData[4] = {};
DWORD cbValueData[4] = {};
::RegQueryValueEx(hKey, L"left", nullptr, &ValueType[0], (BYTE*)&ValueData[0], &cbValueData[0]);
::RegQueryValueEx(hKey, L"top", nullptr, &ValueType[1], (BYTE*)&ValueData[1], &cbValueData[1]);
::RegQueryValueEx(hKey, L"right", nullptr, &ValueType[2], (BYTE*)&ValueData[2], &cbValueData[2]);
::RegQueryValueEx(hKey, L"bottom", nullptr, &ValueType[3], (BYTE*)&ValueData[3], &cbValueData[3]);

int left = ValueData[0];
int top = ValueData[1];
int right = ValueData[2];
int bottom = ValueData[3];
TCHAR szMsg[100] = {};
wsprintf(szMsg, L"%d %d %d %d", left, top, right, bottom);
::MessageBox(nullptr, szMsg, L"窗口尺寸", MB_OK);
//::SetWindowPos(hWnd, nullptr, left, top, right, bottom, SWP_SHOWWINDOW);
//::SetWindowPos(hWnd, nullptr, left, top, right - left, bottom - top, SWP_SHOWWINDOW);
}

return 0;
}

我在注册表编辑器中能看到这些键的值(都不是零),但MessageBox显示的结果却是4个0

热点排行