void GetAppData(void)
{
HKEY hKey;
DWORD dwDataSize;
RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_READ, &hKey);
RegQueryValueEx(hKey,"AppData",NULL, 0, (unsigned char *)szAppData, &dwDataSize);
RegCloseKey(hKey);
}
Что за непонятныя ситуация???
Прогаю в Visual C++ 6, и случился вот такой косяк:
Есть функция для получения пути к папке AppData:
Код:
так вот, функция работает только в некоторых случаях:
1. Если в функции WinMain создать кнопку:
Код:
HWND B=CreateWindow("button",0,0,0,0,0,0,0,(HMENU)10000,0,0);
самое гланое тут, это что класс был "button", и указать команду((HMENU)10000)
2. Если сам код функции поместить в функцию WinMain.
3. Или только в DEBUG режиме.
Если не выполнить одно из условий то в массиве szAppData ничего нет!!!
Что я только не делал с проектом, ни в какую не хочет работать. Особенно
меня удивляет первый пункт.
С чем это может быть связано? не могу представить.
эм... никак это не связано. Лучше приведи полный код. А перед этим проверь что возвращают функции, и посмотри коды ошибок (GetLastError()).
Код:
#pragma comment(lib, "winmm.lib")
#include <windows.h>
char szAppData[255];
HWND hWindow;
long __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void GetAppData(void);
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Window class";
wc.style = CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wc);
hWindow = CreateWindow("Window class", "Window",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
100, 100, 455, 158, 0, 0, hInstance, 0);
//HWND B=CreateWindow("button",0,0,0,0,0,0,0,(HMENU)10000,0,0);
GetAppData();
ShowWindow(hWindow, nCmdShow);
UpdateWindow(hWindow);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return msg.wParam;
}
long __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
}; break;
default: return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
void GetAppData(void)
{
HKEY hKey;
DWORD dwDataSize;
RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_READ, &hKey);
RegQueryValueEx(hKey,"AppData",NULL, 0, (unsigned char *)szAppData, &dwDataSize);
RegCloseKey(hKey);
MessageBox(hWindow, szAppData, "", NULL); // Выводит пустоту
// а если убрать коментарий со строки HWND B=CreateWindow(...
// то выводит то что нужно
}
#include <windows.h>
char szAppData[255];
HWND hWindow;
long __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void GetAppData(void);
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Window class";
wc.style = CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wc);
hWindow = CreateWindow("Window class", "Window",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
100, 100, 455, 158, 0, 0, hInstance, 0);
//HWND B=CreateWindow("button",0,0,0,0,0,0,0,(HMENU)10000,0,0);
GetAppData();
ShowWindow(hWindow, nCmdShow);
UpdateWindow(hWindow);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return msg.wParam;
}
long __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
}; break;
default: return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
void GetAppData(void)
{
HKEY hKey;
DWORD dwDataSize;
RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_READ, &hKey);
RegQueryValueEx(hKey,"AppData",NULL, 0, (unsigned char *)szAppData, &dwDataSize);
RegCloseKey(hKey);
MessageBox(hWindow, szAppData, "", NULL); // Выводит пустоту
// а если убрать коментарий со строки HWND B=CreateWindow(...
// то выводит то что нужно
}
Цитата:
lpcbData
A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData.
Че то я не догоняю, а причем тут lpcbData??? Объяснил бы хоть!
Код:
DWORD dwDataSize = sizeof(szAppData);
Цитата: geza
Че то я не догоняю, а причем тут lpcbData??? Объяснил бы хоть!
MSDN
RegQueryValueEx
lpcbData
[in, out] Pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData.
Шо не ясно?
Но честно говоря я не понял при чем тут кнопка, почему с ней работает? и остальные пункты тоже причем???
Цитата: geza
Тьфу ты... как я не заметил )))) Спасибо!!!
Но честно говоря я не понял при чем тут кнопка, почему с ней работает? и остальные пункты тоже причем???
Но честно говоря я не понял при чем тут кнопка, почему с ней работает? и остальные пункты тоже причем???
Учи матчасть, если не знаешь как происходит создание локальных переменных функций и вызов функций.
Работает не из-за того, что кнопка создается, а из-за того что вызывается функция, при этом модифицируются значения в стеке, в том месте, где потом будет лежать переменная dwDataSize.