Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Ссылка/Указатель нужно значение из LPARAM


Автор: SolRus 29.2.2012, 06:03
Подскажите, как в функции ProcessList получить значение hWnd чтоб изменить?

Код
// здесь hWnd - значение, &hWnd - адрес
HWND hWnd;
EnumWindows(ProcessList, (LPARAM) &hWnd);

BOOL CALLBACK ProcessList(HWND hWnd,LPARAM lParam) {
    // здесь lParam - адрес на что указует = &hWnd
    // а &lParam - адрес самого указателя
}

как писать lParam чтоб значение было?

понимаю что можно так :EnumWindows(ProcessList, (LPARAM) hWnd); но тогда значение hWnd не изменится :(

что-то так доконца с этими ссылками/указателями недоразбирался :( (если что faq читал)

===================
и вопрос № 2, не совсем в тему: 
Код
long &k = 0x01010101;    // даю адрес! но почему нельзя?
long *k = NULL;        // а так можно? где находится K и на что ссылается?


Автор: Dem_max 29.2.2012, 06:46
Код


HWND hWnd;
EnumWindows(ProcessList, (LPARAM) hWnd);

BOOL CALLBACK ProcessList(HWND hWnd, LPARAM lParam)
{
   SetWindowText((HWND)lParam,......);
}

Автор: feodorv 29.2.2012, 08:23
Цитата(SolRus @  29.2.2012,  06:03 Найти цитируемый пост)
как писать lParam чтоб значение было?

Ну, если
Цитата(SolRus @  29.2.2012,  06:03 Найти цитируемый пост)
EnumWindows(ProcessList, (LPARAM) &hWnd);

то
Код

* ((HWND *) lParam) = ...



Цитата(SolRus @  29.2.2012,  06:03 Найти цитируемый пост)
long &k = 0x01010101;    // даю адрес! но почему нельзя?

Это у Вас C или C++?
Адрес чего? Или  это значение адреса?
Цитата(SolRus @  29.2.2012,  06:03 Найти цитируемый пост)
long *k = NULL;        // а так можно? где находится K и на что ссылается?

Так можно. k находится в адресном пространстве процесса, занимает 4 байта (для 32-битных систем) или 8 байт (для 64-битных). Ссылается на область памяти с нулевым адресом (ни писать туда, ни читать оттуда нельзя).
Т.е.:
Код

Адресное пространство процесса:
|---------------------------------------------------|4байта|--------------------...
0                                                   k
^                                                   |
|___________________________________________________+

Автор: SolRus 29.2.2012, 16:45
Цитата(feodorv @ 29.2.2012,  08:23)
то
Код

* ((HWND *) lParam) = ...

точно  smile  блин как мне понять эти указатели :(

Цитата(feodorv @ 29.2.2012,  08:23)
Это у Вас C или C++?
Адрес чего? Или  это значение адреса?

это с++ почему нельзя ссылаться на случайный адрес в памяти? или это просто запрет с++ и в с так можно?
Цитата(feodorv @ 29.2.2012,  08:23)
Так можно. k находится в адресном пространстве процесса, занимает 4 байта (для 32-битных систем) или 8 байт (для 64-битных). Ссылается на область памяти с нулевым адресом (ни писать туда, ни читать оттуда нельзя).

из твоей записи показывается что k создается и имеет адрес в памяти, однако если cout << (long) k;
выводит 0 , т.е. адрес указателя 0 ? создал второй такой же указатель и у него адрес тоже 0 
они создаются?
Код

long *k = 0x000000;
*k = 5;

Нарушение прав доступа при записи "0x00000000".  
я правильно понял - что этим я пытаюсь перезапись свой код [CS] в памяти? (или сегмент кода начинается не с 0?)
отчего кстати можно указывать на нулевой адрес, а на 0x00000001 уже нельзя?

Автор: feodorv 29.2.2012, 17:43
Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
блин как мне понять эти указатели :(

Ой, да нет здесь ничего сложного))) Один раз понять, и всё)))


Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
почему нельзя ссылаться на случайный адрес в памяти?

Можно!
Код

unsigned char *anyPointer = (unsigned char *) 0x1010101010;

В C++ - через type cast.



Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
однако если cout << (long) k; выводит 0

А что же ещё должно было вывеститься?))))
Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
k создается и имеет адрес в памяти

Что значит "k имеет адрес в памяти"?
Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
т.е. адрес указателя 0 ?

Ээээ, нет. Значение(!) указателя 0!!!


Вот представь себе большуший непрерывный набор байт размером, скажем, 4 гига. Каждый байт в этом наборе имеет номер: 0-й байт, 1-й байт .... Этот номер и будет являтся адресом байта. И если написать
Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
long *k = 0x000000;

то это значит для компилятора, что k является номером байта, в данном случае номер байта ноль (по счёту). При этом сама переменная k занимает какое-то пространство в памяти процесса (то есть занимает какие-то 4 байта из диапазона 0-4G), но значением её будет 0. Именно поэтому (long) k даст 0. А вот если захочется понять, какие именно байты в памяти процесса отведены под переменную k, то нужно посмотреть на адрес этой переменной: (long) &k.


Цитата(feodorv @  29.2.2012,  08:23 Найти цитируемый пост)
long &k = 0x01010101;    // даю адрес! но почему нельзя?

А вот здесь не задаётся никакой адрес!!!))) В C такой конструкции нет, это C++. Конструкция означает, что переменная k задана по ссылке, и значение переменной есть 0x01010101. На вид никакого адреса, но он всё же невидимо присутствует (и задать его нельзя).


Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
Нарушение прав доступа при записи "0x00000000".  

Это особый разговор))) Некоторые области памяти процесса (специально!) защищены от чтения или записи. 
Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
я правильно понял - что этим я пытаюсь перезапись свой код [CS] в памяти? 

Нет))) Всего лишь попытка поместить целочисленное 5 в первые 4-е байта памяти процесса, не более)))


Цитата(SolRus @  29.2.2012,  16:45 Найти цитируемый пост)
отчего кстати можно указывать на нулевой адрес, а на 0x00000001 уже нельзя? 

Можно на любой, но во всём важен смысл)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)