· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HELHEIM —› Сохранение чисел в памяти

Посл.отвђт Сообщенiе


Дата: Авг 25, 2004 17:21:53 · Поправил: NetSharp

Здравствуйте. У меня следующий вопрос (прошу сильно меня не бить, я совсем недавно стал ассемблер учить):
Нужно получить все дескрипторы дочерних окон одного окна верхнего уровня и сохранить их в памяти, чтобы в последствии поменять у них родителя на рабочий стол (т.е. "переместить" все окна на рабочий стол). Итак, делаю я это таким образом
;---------------------------------------
GetsWindows proc hWnd:HWND
	invoke GetWindow, hWnd, GW_CHILD
	mov edx, eax
	xor ecx, ecx
	cmp edx, 0h
	je @NoWindow
	jmp @ItWindow
@NoWindow:
	mov eax, ecx
	ret
@ItWindow:
	mov es:[ecx*4], edx   ;С этой строкой проблемы
	inc ecx
	push ecx
	invoke GetWindow, edx, GW_HWNDNEXT
	pop ecx
	mov edx, eax
	cmp edx, 0h
	je @NoWindow
	jmp @ItWindow
	ret
GetsWindows endp
;----------------------------------------

Как видно из листинга, сохранять дескрипторы я пытаюсь по адресу es:[ecx*4], соответствено, инкрементируя ecx. Далее я меняю у окон родителя:
;----------------------------------------
RemoveWindows proc nCount:DWORD
	mov ecx, nCount
@Loop:
	dec ecx
	push ecx
	invoke SetParent, es:[ecx*4], DesktopHandle
	pop ecx
	cmp ecx, 0h
	jg @Loop
	ret
RemoveWindows endp
;----------------------------------------

Проблема в том, что, вероятно, записать по адресу es:[ecx*4] не получается равно как и прочитать тоже. В отладчике я пробовал менять базу на fs (т.е. fs:[ecx*4]), в результате чего все работало (однако тоже не всегда). Но и скомпилировать программу, используя регистр fs, тоже не получается (ошибка: use of register assumed to ERROR). Подскажите, пожалуйста, где может быть ошибка?

P.S. Надеюсь на вашу снисходительность к ламерам, вроде меня.


Дата: Авг 26, 2004 10:49:57

Для "use of register assumed to ERROR" смотри настройки .Model.... е.р. ставь ASSUME fs:data.

А вообще сама прога имхо изначально не верна. Вот аналогичная С++ продседура минимизации дочерних окон:
void CMainFrame::OnWindowMa()
{
        // TODO: Add your command handler code here
HWND w=::GetTopWindow(this->m_hWndMDIClient);
while(w!=0){
        ::ShowWindow(w,SW_SHOWMINIMIZED);
        w=::GetNextWindow(w,GW_HWNDNEXT);
        }
}


В твоем случае надо ShowWindow заменить на SetParent (с твоими параметрами), и я вообще не вижу необходимости использовать дополнительные регистры es и fs


Дата: Авг 26, 2004 11:38:46 · Поправил: q_q

NetSharp
При программировании под win32 забудьте про все сегментные регистры, по крайней мере на начальном этапе.

NetSharp & zzzyab
Зачем цикл если есть EnumChildWindows?


Дата: Авг 27, 2004 01:47:24

q_q
Спасибо, с EnumChildWindows теперь работает.

Но все-таки ряд дескрипторов мне нужно где-нибудь хранить. Подскажите, как это можно организовать?


Дата: Авг 27, 2004 03:43:21

NetSharp
ряд дескрипторов мне нужно где-нибудь хранить
Конкретнее. Может ты хочешь хранить их между сеансами работы программы.


Дата: Авг 27, 2004 16:47:15 · Поправил: NetSharp

Конкретнее. Может ты хочешь хранить их между сеансами работы программы.
Нет, хранить только во время работы приложения. Их нужно просто держать в памяти, как в переменной, чтобы в любой момент к ним можно было обратиться.


Дата: Авг 27, 2004 19:28:04

„Их нужно просто держать в памяти, как в переменной“

Ну а DesktopHandle у тебя это что ?

Память под переменную зарезервируй (смотри в секцию .data как делают другие , а лучше почитай доки) .
Например если надо 4 байта , то резервируешь "variable dd 0" , а потом к ней обращаешся "mov variable,eax" или там "invoke GetWindow,variable,GW_HWNDNEXT" .
Если надо 40 байт , то делаешь "variable dd 10 DUP (0)" и т.д. короче , грех о таком спрашивать :)
Разберёшься сам или обьяснять ?


Дата: Авг 30, 2004 06:17:38

NetSharp
хранить только во время работы приложения
Память можно резервировать в сегменте данных, bogrus показал как, можно резервировать в стеке - локальные переменные, можно резервировать и освобождать при помощи функций ОС: GlobalAlloc/GlobalFree, HeapAlloc/HeapFree, VirtualAlloc/VirtualFree.


Дата: Авг 30, 2004 12:59:00

Большое спасибо всем, разобрался.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.081