Глобальные переменные

Тема в разделе "WASM.BEGINNERS", создана пользователем D_Bob, 29 авг 2005.

  1. D_Bob

    D_Bob New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    1
    Адрес:
    Севастополь
    Как определить глобальные для всего проекта?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Асм?

    Если модуль один, то просто в секции данных (.data).

    Если несколько, то объявляешь в одном, делаешь их паблик, а других модулях объявляешь через extern (в масме есть ещё externdef):
    Код (Text):
    1.  
    2. mod1.asm
    3. .data
    4. public var1
    5. var1  dd 12
    6.  
    7. mod2.asm
    8. extern var1:DWORD
    9. .data
    10. var2 db ?
    11. ...


    Читай документацию масма.
     
  3. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    А как бы минимизировать их использование?
    Вот конкретный пример: Содержимое hOldClipViewer теряется при входе/выходе в процедуру. Приходится выносить её в глобальные uninitialized .data? А не хочется... ;o)
    Код (Text):
    1. MainDlgProc proc hWnd:HWND, Msg:UINT, wParam:WPARAM, lParam:LPARAM
    2. LOCAL hOldClipViewer:HWND
    3.     push ebx
    4.     push esi
    5.     push edi
    6.     mov ebx, hWnd
    7.     .IF Msg==WM_DESTROY
    8.         invoke ChangeClipboardChain, ebx, hOldClipViewer    ; Восстанавливаем старый клипбоард вьювер
    9.         invoke PostQuitMessage, NULL
    10.     .ELSEIF Msg==WM_INITDIALOG
    11.         invoke  SetClipboardViewer, hWnd           ; Окно должно мониторить клипбоард
    12.         mov hOldClipViewer, eax          ; Сохраняю старый клипбоард вьювер
    13.     .ELSEIF Msg==WM_COMMAND
    14. <далее не интересно>
    А ещё нужны флаги различные, ещё куча хэндлов всяких... Можно что нибудь с этим сделать?

    PS.
    Диалоговое окно у меня создается так:
    Код (Text):
    1.     invoke RegisterClassEx, addr wc      ; Класс регистрирую для проверки запущенной копии программы
    2.     invoke CreateDialogParam, hInstance, ADDR MainDlgName, NULL, ADDR MainDlgProc, NULL
    3.     or  eax, eax
    4.     jnz DialogCreated
    5.     ret
    Может окно можно как нибудь по другому сделать?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    ALLeX
    Собственно асм не С - и особой разницы между static и глобальной на уровне модуля переменной в нём просто не предусмотрено идеологией. Ограничить область видимости переменной можно либо поместив её внутрь макроса как local, тогда в другом макросе или основной программе можно будет использовать тоже имя. Или самому можно поизвращатся с реализацией перегрузки имён с помощью макросов, втихаря приписывающих номер к перегружаемому имени.