Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: 0x7FFFFFF0
Дата сообщения: 06.11.2008 01:57
Я правильно понимаю что если есть int 0x00005678 то в памяти он будет выглядеть как :
0x78560000 ?
Вопрос номер два:
Как можно получить адрес стека и сегмента данных?
Автор: akaGM
Дата сообщения: 06.11.2008 15:37
0x7FFFFFF0
1. для x86-архитектуры -- да...

2. можно и вот так, наверное:
Код:
unsigned long stackAddr = 0;
unsigned long dataAddr = 0;

_asm {
xor eax, eax
mov ax, ds
mov dword ptr dataAddr, eax

xor eax, eax
mov ax, ss
mov dword ptr stackAddr, eax
}
printf("data = %0.4X; stack = %0.4X\n", dataAddr, stackAddr);
Автор: Lyrik
Дата сообщения: 06.11.2008 16:33
0x7FFFFFF0

Цитата:
Как можно получить адрес стека и сегмента данных?

Желательно уточнять какой адрес нужно получить. Если виртуальный, то akaGM написал верно.

Автор: Qraizer
Дата сообщения: 06.11.2008 20:22
0x7FFFFFF0, не правильно. В памяти оно будет (от младших адресов к старшим) 0x78, 0x56, 0x00, 0x00.
Автор: akaGM
Дата сообщения: 06.11.2008 20:43
Qraizer
эээ...
ты ж повторил его последовательность...
?

0x7FFFFFF0
в общем, работает такое правило:

"старший байт на старших адресах, старшее слово на старших адресах"
Автор: Qraizer
Дата сообщения: 07.11.2008 22:18
akaGM, не в коем разе не повторил, только сделал акцент на расположении байт. То, как он это написал, в равной мере может относиться к неверному пониманию принципов байт-адресуемой памяти, размещению в памяти объектов с размером, превышающем минимальную адресуемую единицу (обычно байт, но не обязательно, я, к примеру, встречался с архитектурой, где адресуемой единицей было 16-битное слово, а не 8-битный байт) или непониманю 2-й системы счисления в целом и её отношения к реальной действительности в частности.
Автор: 0x7FFFFFF0
Дата сообщения: 08.11.2008 02:21
Прошу прощения я забыл упомянуть что адрес стека нужно найти в памяти другого процесса... Я думаю о инжекте кода но ведь есть альтернатива ?
Автор: akaGM
Дата сообщения: 10.11.2008 14:14
Qraizer
не уловил я тонкостей, ну да ладно...

0x7FFFFFF0
тогда тебе к ассемблерщикам, а ещё лучше -- к вирусописателям/вирусологам...
Автор: Lyrik
Дата сообщения: 10.11.2008 18:00
0x7FFFFFF0
Инжект - это надежно и просто, так что юзай лучше его
Автор: vixel
Дата сообщения: 12.11.2008 08:43
Подскажите, как в трей загнать объект (текст или картинку),
размером больше одной иконки. Такое часто делают программы,
которые рисуют в трее часы с разными скинами.
Автор: ShIvADeSt
Дата сообщения: 12.11.2008 09:00
vixel
http://delphisite.ru/faq/sistemnye-funktsii-i-winapi/windows/sistemnyi-trei читай там, я сделал простенькие часы, которые заменили стандартные.
Автор: ChiPnGo
Дата сообщения: 12.11.2008 21:27
Есть юнит на делфи, который описывает класс и его окно.
При создании происходит RegisterClass(wndClass) для класса окна, но в wndClass нужно передавать указатель на WndProc (TWndClass.lpfnWndProc). А эта функция должна использовать поля конкретного объекта, поскольку нужно иметь возможность открывать много таких окон в одной программе.

Можно ли как-то вписать WndProc методом класса? (или еще как-то обойти)
Если адреса Вндпроцедур будут разными - то у них должны быть разные классы окна?

ПС Кроме этой функции есть еще и другие с подобной проблемой.
Автор: Abs62
Дата сообщения: 12.11.2008 22:36
ChiPnGo

Цитата:
Можно ли как-то вписать WndProc методом класса?

Нет, нельзя. Метод класса от обычной функции отличается тем, что в него кроме явно описанных параметров передаётся ещё один скрытый - указатель на экземпляр класса.

Цитата:
(или еще как-то обойти)

Обойти можно. Записать указатель на класс в структуру окна через SetWindowLongPtr с параметром GWLP_USERDATA, а в оконной функции извлекать его через GetWindowLongPtr и вызывать нужные методы через него как через обычный указатель.

Цитата:
Если адреса Вндпроцедур будут разными - то у них должны быть разные классы окна?

Обычно одна оконная функция обслуживает все окна данного класса. Но при необходимости можно задать и другую оконную функцию для конкретного окна. С помощью SetWindowLongPtr с параметром GWLP_WNDPROC.
Автор: ChiPnGo
Дата сообщения: 13.11.2008 00:11
Полезные функции. А откуда их подгружать? В старых версиях заголовочных файлов такого нет.
Автор: Abs62
Дата сообщения: 13.11.2008 00:48
ChiPnGo
Если не предполагается создание 64-разрядного кода, можно использовать SetWindowLong/GetWindowLong.
Или добавить прототипы самому. См. здесь, например.
Автор: vserd
Дата сообщения: 13.11.2008 09:44
ChiPnGo


Цитата:
Можно ли как-то вписать WndProc методом класса? (или еще как-то обойти)
Если адреса Вндпроцедур будут разными - то у них должны быть разные классы окна?

Попробуй мой пост http://forum.ru-board.com/topic.cgi?forum=33&topic=5223
В создании окон не пробовал, но в других местах срабатывает.

первоисточник: http://ifolder.ru/9050972 , в инете статьи уже на нахожу.
Автор: lorents
Дата сообщения: 13.11.2008 19:41
помогите пожалуйста сделать такое
хочу сделать код сохранить файл и что бы была проверка на наличие если есть такой файл выдать диалоговое окно предупреждения

Автор: Abs62
Дата сообщения: 13.11.2008 20:30
lorents
GetSaveFileName с установленным флагом OFN_OVERWRITEPROMPT.
Автор: lorents
Дата сообщения: 13.11.2008 21:20
Abs62
я извиняюсь, простоя я не на C++ программирую
вы уж извините, но если вам не очень трудно не могли бы написать пример на C++ с вызовом и проверки и с объяснением что к чему, очень надо, если вам не очень трудно напишите пожалуйста
Автор: Abs62
Дата сообщения: 13.11.2008 22:19
lorents
В сети несложно найти примеры на разных языках. Например:
C++
Visual Basic
Dephi
Автор: ChiPnGo
Дата сообщения: 14.11.2008 15:51
lorents
А на чем вы программируете? Можно было б тогда конкретнее.
WinAPI - это же не функции языка, а интерфейс между любой программой и системой + разные общие полезности.
Автор: VitaliM
Дата сообщения: 14.11.2008 16:23
Все, наверное, сталкивались с тем что при скачивании исполняемого файла с помощью IE перед запуском этого файла ОС задает вопрос о безопасности скачаного файла. Это происходит потому что у файла, если открыть его свойства, стоит дополнительный атрибут "заблокировано". Его можно снять в свойствах. Так вот вопрос, как программно поставить такой атрибут.
Автор: ChiPnGo
Дата сообщения: 14.11.2008 17:43
Еще вопрос по теме.
http://forum.ru-board.com/topic.cgi?forum=33&topic=0555&start=732

Этот юнит с классом теперь оформлен в виде длл.
Внутри функция, которая создает очередное окно при вызове и возвращает указатель на очередной объект класса. В ней запускается метод Run класса, в котором цикл приема сообщений.
Создание следующего окна блокирует выполнение Run предыдущего.
Создание потока (BeginThread с параметрами: указатель на созданный объект и указатель на функцию, которая по этому указателю вызывает Run нужного объекта) приводит к нормальному созданию окна и входу в Run, которое после нескольких операций зависает + закрытие окна убивает весь процесс. Похоже на неудачное создание потока выполнения с последующей утечкой памяти:
http://qc.codegear.com/wc/qcmain.aspx?d=67691

В фиксе еще неизвестный идентификатор "SystemThreadFuncProc".

PS Просто выходит как-то из Run. Гудини нашелся...
Автор: ShIvADeSt
Дата сообщения: 15.11.2008 02:55
ChiPnGo

Цитата:
Этот юнит с классом теперь оформлен в виде длл.

Ну у меня без длл и все нормально работает. Юзайте оригинальные данные. Утечек не видел.
Автор: Qraizer
Дата сообщения: 15.11.2008 18:49
VitaliM, сильно подозреваю, что это не атрибут. Я замечал у таких файлов альтернативный NTFS-поток, но не уверен, что дело ограничивается им. Попробуй покопай в этом направлении.
Автор: Abs62
Дата сообщения: 15.11.2008 20:59
Qraizer
Тем не менее, если этот дополнительный поток удалить, кнопка "Unblock" из свойств исчезает. Присобачишь эти данные к другому файлу - появляется у того. Видимо, именно этот поток и надо копать.

PS. Тут есть некоторые подробности.
Автор: theHelg
Дата сообщения: 15.11.2008 22:16
Добрый день!

Есть оконное графическое приложение, которое САМО меняет картинку курсора мышки.

Мне нужно отловить момент, когда приложение меняет курсор с одного на другой.

MouseGetCursor возвращает все время тип ARROW, хотя в приложении форма курсора меняется...

Функция GetCursorInfo - через handle возвращает все время один и тот же указатель, несмотря на то, что курсор меняется...

Пытаюсь отловить цвет пикселя на указатели мышки, но GetPixel из gdi32.dll мне дает лишь цвет пикселя ПОД мышкой!
Смотрю цвет, что-то типа такого:
$pos = MouseGetPos()
$varColor = PixelGetColor($pos[0]+2, $pos[1]+2)

Собственно вопрос. Как или чем можно вытащить тип курсора (который всегда ARROW) или хотя бы цвет указателя мышки...

ЗЫ Print Screen не предлагать... уже думал над этим, но очень долго работает...
Автор: windwail
Дата сообщения: 27.11.2008 16:18
Ну обычно курсор меняется черерз это
SetClassLong (hwndChild, GCL_HCURSOR, LoadCursor (hInstance, TEXT ("childcursor")) ;

Автор: stupid_user
Дата сообщения: 28.11.2008 19:21
Нужно написать на WinApi аналог сишной функции fopen(FileName, Mode).
Апишная функция CreateFile, но вот не могу понять как с режимами открытия быть.
Например "rt" - тестовый режим; "rb" - бинарный режим. Как эти режимы скармливать CreateFile?
*пишу на delphi
Автор: Abs62
Дата сообщения: 28.11.2008 19:44
stupid_user
Никак. WinAPI понятия не имеет о сишных потоках ввода-вывода. ReadFile/WriteFile работают в бинарном режиме.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.