Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылка/Указатель нужно значение из LPARAM 
V
    Опции темы
SolRus
  Дата 29.2.2012, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Подскажите, как в функции 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 и на что ссылается?



Это сообщение отредактировал(а) SolRus - 29.2.2012, 06:07
PM MAIL Skype   Вверх
Dem_max
Дата 29.2.2012, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Код


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

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



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 29.2.2012, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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
^                                                   |
|___________________________________________________+


Это сообщение отредактировал(а) feodorv - 29.2.2012, 08:26


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
SolRus
Дата 29.2.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



Цитата(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 уже нельзя?
PM MAIL Skype   Вверх
feodorv
Дата 29.2.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 уже нельзя? 

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

Это сообщение отредактировал(а) feodorv - 29.2.2012, 17:45


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.