|
|
| Посл.отвђт | Сообщен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 |