Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Что за непонятныя ситуация???

3.1K
26 сентября 2007 года
geza
85 / / 02.02.2005
Я был просто в шоке, все нервы себе истрепал из за этого!!!

Прогаю в Visual C++ 6, и случился вот такой косяк:
Есть функция для получения пути к папке AppData:
 
Код:
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);
}

так вот, функция работает только в некоторых случаях:
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 ничего нет!!!
Что я только не делал с проектом, ни в какую не хочет работать. Особенно
меня удивляет первый пункт.
С чем это может быть связано? не могу представить.
2.9K
26 сентября 2007 года
Ation
96 / / 27.07.2004
эм... никак это не связано. Лучше приведи полный код. А перед этим проверь что возвращают функции, и посмотри коды ошибок (GetLastError()).
3.1K
26 сентября 2007 года
geza
85 / / 02.02.2005
Да пожалусто:
Код:
#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(...
    // то выводит то что нужно
}
3
26 сентября 2007 года
Green
4.8K / / 20.01.2000
Ответ прост: читай MSDN.
Цитата:

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.

3.1K
26 сентября 2007 года
geza
85 / / 02.02.2005
Че то я не догоняю, а причем тут lpcbData??? Объяснил бы хоть!
353
27 сентября 2007 года
Nixus
840 / / 04.01.2007
dwDataSize инициализировать нужно, прежде чем передавать.

 
Код:
DWORD dwDataSize = sizeof(szAppData);
398
27 сентября 2007 года
Alexandoros
630 / / 21.10.2005
Цитата: 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.

Шо не ясно?

3.1K
27 сентября 2007 года
geza
85 / / 02.02.2005
Тьфу ты... как я не заметил )))) Спасибо!!!
Но честно говоря я не понял при чем тут кнопка, почему с ней работает? и остальные пункты тоже причем???
353
27 сентября 2007 года
Nixus
840 / / 04.01.2007
Цитата: geza
Тьфу ты... как я не заметил )))) Спасибо!!!
Но честно говоря я не понял при чем тут кнопка, почему с ней работает? и остальные пункты тоже причем???


Учи матчасть, если не знаешь как происходит создание локальных переменных функций и вызов функций.
Работает не из-за того, что кнопка создается, а из-за того что вызывается функция, при этом модифицируются значения в стеке, в том месте, где потом будет лежать переменная dwDataSize.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог