Сам себе Iczelion

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl_, 11 май 2007.

Метки:
  1. Scholium

    Scholium New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2009
    Сообщения:
    96
    Очень интересный цикл программ! Еще бы и текст сопроводительный, так получился бы туториал лучше чем у Iczelion’a :) .

    Правда, хотелось бы вставить и свои пять копеек :) . Мне нравиться Ваш отказ от PROTO и INC-файлов. Осталось еще объявить и другие директивы для экспортируемых функций. Например, у меня работают все варианты экспорта функций (достаточно выбрать любой комментарий):

    Код (Text):
    1. ; ===========================================================================
    2.  
    3. .686p
    4. .mmx
    5. .model flat
    6.  
    7. option casemap:none
    8.  
    9. ; extrn MessageBoxA : proc
    10. extrn MessageBoxA@16 : proc
    11. ; extrn _imp__MessageBoxA : dword
    12. ; extrn _imp__MessageBoxA@16 : dword
    13.  
    14. includelib Lib\user32.lib
    15.  
    16. ; extrn ExitProcess : proc
    17. extrn ExitProcess@4 : proc
    18. ; extrn _imp__ExitProcess : dword
    19. ; extrn _imp__ExitProcess@4 : dword
    20.  
    21. includelib Lib\kernel32.lib
    22.  
    23. ; ===========================================================================
    24.  
    25. .data
    26.  
    27. Header         db "Question", 0
    28. MsgText      db "Do you want quit?", 0
    29.  
    30. ; ===========================================================================
    31.  
    32. .code
    33.  
    34. _Start:
    35.  
    36. push 4h         ; MB_YESNO
    37. push offset Header
    38. push offset MsgText
    39. push 0
    40.  
    41. ; call MessageBoxA
    42. call MessageBoxA@16
    43. ; call _imp__MessageBoxA
    44. ; call _imp__MessageBoxA@16
    45.    
    46. cmp eax, 6h     ; IDYES : 6 - Yes, 7 - No.
    47. je Quit
    48. jmp _Start
    49.  
    50. Quit:
    51.  
    52. push 0
    53.  
    54. ; call ExitProcess
    55. call ExitProcess@4
    56. ; call _imp__ExitProcess
    57. ; call _imp__ExitProcess@4
    58.  
    59. end _Start
    60.  
    61. ; ===========================================================================
    Для это пришлось правда самому создать полноценные lib-файлы для нужных системных dll-ек.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Scholium
    Можо и без lib-файлов обойтись используя одни только dll. Вот вариант который возможно вас устроит использовать импорт не по именам, а по ординалам и при этом пользоваться MASM
    Код (Text):
    1. ; masm dos com #
    2. .586P
    3. .model tiny
    4. .code
    5. ;for WinXP - 323 bytes
    6. exebase equ 400000h
    7. begin:
    8. ;-------------------------------------------------------------------
    9. DOS_and_NT_SIGNATURES   dd 'ZM','EP'        ;00 ; signatures
    10. FILE_HEADER:
    11. Machine                dw 14Ch          ;8
    12. Count_of_section    dw 1            ;0Ah
    13. TimeStamp       dd 0,0,0        ;0C ; who cares?
    14. Size_of_optional_header dw SECTION_HEADER-$-4   ;74h            ;18
    15. Characteristics1        dw 10Fh         ;1A ; executable on 32-bit-machine
    16. OPTIONAL_HEADER:
    17. Magic                  dd 10Bh          ;1C ; constant
    18. SizeOfCode             dd END_SECTION-start,0,0;20  ; size of .code/.idata/.data
    19. AddressOfStart      dd start    ;2C ; beginning of code section
    20. BaseOfCode             dd start ;30 ; RVA to code section: unused
    21. BaseOfData             dd 0,exebase,4,4         ;38 ; 4 MB, chosen arbitrarily
    22. MajorOperatingSystemVersion dd 4,0,4,0      ;44     ;versions
    23. SizeOfImage            dd END_SECTION   ;54     ; total size
    24. SizeOfHeaders          dd start ;58 ; offset to 1st section
    25. CheckSum               dd 0,2,100000h,1000h     ;5C ; subsystem,stack reserve/commit
    26. SizeOfHeapReserve      dd 100000h,1000h,0       ;6C ; heap reserve/commit,flags
    27. Number_of_dirs      dd 2                    ;78     ; # directories
    28. DATA_DIRECTORY:
    29. DIRECTORY_ENTRY_EXPORT  dd 0;export     ;7C
    30.             dd 0                    ;80
    31.             dd import   ;84
    32.                         dd end_import-import    ;88
    33.             dd 0;resource          ;8C
    34. SECTION_HEADER:
    35. _Name                   dd 'xet.','t';exception ;90,94  ; ".text"
    36. VirtualSize             dd 0                    ;98
    37.             dd start;security;9C    ; unused
    38. SizeOfRawData          dd END_SECTION-start ;A0 ; size of code
    39. PointerToRawData       dd start;fixup           ;A4 ; file offset to code section
    40. PointerToRelocations   dd 0             ;A8 ; unused
    41.             dd 0;debug          ;AC
    42.             dd 0                    ;B0
    43. Characteristics2        dd 0E0000020h       ;B4 ; code, executable, readable
    44.                                                     ; initialized data, writeable
    45. ;---------------------------------------------------------------------
    46. start:  push eax
    47.     push offset wTitle+exebase
    48.     push offset Message+exebase
    49.     push eax
    50.     call MessageBox+exebase
    51.         retn
    52. ;----------------------------------------------------------------------
    53. wTitle  db 'Iczelion Tutorial #2:MessageBox',0
    54. Message db 'Win32 Assembly with MASM is Great!'
    55. ;----------------------------------------------------------------------
    56. import:
    57. dd 0,0,0,user32_dll
    58. dd user32_table,0,0
    59. user32_table:
    60. MessageBox      dd _MessageBoxA
    61.                 dw 0
    62. _MessageBoxA    db 0,0,'MessageBoxA',0      
    63. user32_dll  db 'user32'
    64. end_import:
    65. END_SECTION:
    66. end begin
    компилируете как COM, а получаете полноценное Windows приложение, под WinXP занимает аж целых 323 байта, самостоятельно можете получать любой PE-заголовок, отрывать в импорте "ненужное" окончание в виде ".dll" и другие мелкие шалости ;)
     
  3. Scholium

    Scholium New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2009
    Сообщения:
    96
    Для меня это было откровением! Действительно 323 байта и, действительно, без либов. Т.е. подобный метод надо взять на вооружение для какого-нибудь экстремального программирования :) . Однако замечания все же есть.

    1. Приходится пользоваться устаревшим пакетом Masm32, вроде версии 6.11 (т.е. программы от последних версий студии не катят).
    2. Нет либов, но практически присутствуют неявные дефы. Для больших программ, использующих множество апишных функций, придется писать самому значительные секции импорта, отражающие, по сути, структуру def-файлов.
    3. Насчет ординалов я не понял. Вы же объявляете и используете имена функций. Привязка же к ординалам – это крайний случай, когда нет имен. Ибо нет гарантии, что одним и тем же ординалам в разных версиях системных длл-лек соответствуют одни и те же имена функций. Я с этим столкнулся когда писал универсальные дефы и либы для различных ОСей и их сервис паков.

    Так что главное преимущество Вашего метода это компактность и явное управление PE-заголовоком.

    Думаю, что для реальных приложений все же нужны универсальные либы, а точнее их текстовые описания – дефы. Ибо имея дефы, всегда можно скомпилировать либы. А при необходимости в них легко можно вносить изменения. Один раз сделав эту работу можно затем очень сильно упростить себе жизнь.

    Вот пример kernel32.def, который я использовал.

    Код (Text):
    1. LIBRARY "kernel32.dll"
    2. EXPORTS
    3. ActivateActCtx
    4. _ActivateActCtx@8 = ActivateActCtx
    5. AddAtomA
    6. _AddAtomA@4 = AddAtomA
    7. AddAtomW
    8. _AddAtomW@4 = AddAtomW
    9. AddConsoleAliasA
    10. _AddConsoleAliasA@12 = AddConsoleAliasA
    11. AddConsoleAliasW
    12. _AddConsoleAliasW@12 = AddConsoleAliasW
    13. AddLocalAlternateComputerNameA
    14. _AddLocalAlternateComputerNameA@8 = AddLocalAlternateComputerNameA
    15. AddLocalAlternateComputerNameW
    16. _AddLocalAlternateComputerNameW@8 = AddLocalAlternateComputerNameW
    17. AddRefActCtx
    18. _AddRefActCtx@4 = AddRefActCtx
    19. AddVectoredContinueHandler  ; @9
    20. AddVectoredExceptionHandler ; @10
    21. AllocConsole
    22. _AllocConsole@0 = AllocConsole
    23. AllocateUserPhysicalPages
    24. _AllocateUserPhysicalPages@12 = AllocateUserPhysicalPages
    25. AreFileApisANSI
    26. _AreFileApisANSI@0 = AreFileApisANSI
    27. AssignProcessToJobObject
    28. _AssignProcessToJobObject@8 = AssignProcessToJobObject
    29. AttachConsole
    30. _AttachConsole@4 = AttachConsole
    31. BackupRead
    32. _BackupRead@28 = BackupRead
    33. BackupSeek
    34. _BackupSeek@24 = BackupSeek
    35. BackupWrite
    36. _BackupWrite@28 = BackupWrite
    37. BaseCheckAppcompatCache
    38. _BaseCheckAppcompatCache@16 = BaseCheckAppcompatCache
    39. BaseCheckRunApp
    40. _BaseCheckRunApp@40 = BaseCheckRunApp
    41. BaseCleanupAppcompatCacheSupport
    42. _BaseCleanupAppcompatCacheSupport@4 = BaseCleanupAppcompatCacheSupport
    43. BaseDumpAppcompatCache
    44. _BaseDumpAppcompatCache@0 = BaseDumpAppcompatCache
    45. BaseFlushAppcompatCache
    46. _BaseFlushAppcompatCache@0 = BaseFlushAppcompatCache
    47. BaseInitAppcompatCacheSupport
    48. _BaseInitAppcompatCacheSupport@0 = BaseInitAppcompatCacheSupport
    49. BaseIsAppcompatInfrastructureDisabled
    50. _IsShimInfrastructureDisabled@0 = BaseIsAppcompatInfrastructureDisabled
    51. BaseProcessInitPostImport
    52. _BaseProcessInitPostImport@0 = BaseProcessInitPostImport
    53. BaseQueryModuleData
    54. _BaseQueryModuleData@20 = BaseQueryModuleData
    55. BaseUpdateAppcompatCache
    56. _BaseUpdateAppcompatCache@12 = BaseUpdateAppcompatCache
    57. BasepCheckBadapp
    58. _BasepCheckBadapp@36 = BasepCheckBadapp
    59. BasepCheckWinSaferRestrictions
    60. _BasepCheckWinSaferRestrictions@24 = BasepCheckWinSaferRestrictions
    61. BasepFreeAppCompatData
    62. _BasepFreeAppCompatData@8 = BasepFreeAppCompatData
    63. Beep
    64. _Beep@8 = Beep
    65. . . .
    66. WriteFile
    67. _WriteFile@20 = WriteFile
    68. WriteFileEx
    69. _WriteFileEx@20 = WriteFileEx
    70. WriteFileGather
    71. _WriteFileGather@20 = WriteFileGather
    72. WritePrivateProfileSectionA
    73. _WritePrivateProfileSectionA@12 = WritePrivateProfileSectionA
    74. WritePrivateProfileSectionW
    75. _WritePrivateProfileSectionW@12 = WritePrivateProfileSectionW
    76. WritePrivateProfileStringA
    77. _WritePrivateProfileStringA@16 = WritePrivateProfileStringA
    78. WritePrivateProfileStringW
    79. _WritePrivateProfileStringW@16 = WritePrivateProfileStringW
    80. WritePrivateProfileStructA
    81. _WritePrivateProfileStructA@20 = WritePrivateProfileStructA
    82. WritePrivateProfileStructW
    83. _WritePrivateProfileStructW@20 = WritePrivateProfileStructW
    84. WriteProcessMemory
    85. _WriteProcessMemory@20 = WriteProcessMemory
    86. WriteProfileSectionA
    87. _WriteProfileSectionA@8 = WriteProfileSectionA
    88. WriteProfileSectionW
    89. _WriteProfileSectionW@8 = WriteProfileSectionW
    90. WriteProfileStringA
    91. _WriteProfileStringA@12 = WriteProfileStringA
    92. WriteProfileStringW
    93. _WriteProfileStringW@12 = WriteProfileStringW
    94. WriteTapemark
    95. _WriteTapemark@16 = WriteTapemark
    96. ZombifyActCtx
    97. _ZombifyActCtx@4 = ZombifyActCtx
    98. _hread
    99. __lread@12 = _hread
    100. _hwrite
    101. __lwrite@12 = _hwrite
    102. _lclose
    103. __lclose@4 = _lclose
    104. _lcreat
    105. __lcreat@8 = _lcreat
    106. _llseek
    107. __llseek@12 = _llseek
    108. _lopen
    109. __lopen@8 = _lopen
    110. _lread
    111. __lread@12 = _lread
    112. _lwrite
    113. __lwrite@12 = _lwrite
    114. lstrcat
    115. _lstrcatA@8 = lstrcat
    116. lstrcatA
    117. _lstrcatA@8 = lstrcatA
    118. lstrcatW
    119. _lstrcatW@8 = lstrcatW
    120. lstrcmp
    121. _lstrcmpA@8 = lstrcmp
    122. lstrcmpA
    123. _lstrcmpA@8 = lstrcmpA
    124. lstrcmpW
    125. _lstrcmpW@8 = lstrcmpW
    126. lstrcmpi
    127. _lstrcmpiA@8 = lstrcmpi
    128. lstrcmpiA
    129. _lstrcmpiA@8 = lstrcmpiA
    130. lstrcmpiW
    131. _lstrcmpiW@8 = lstrcmpiW
    132. lstrcpy
    133. _lstrcpyA@8 = lstrcpy
    134. lstrcpyA
    135. _lstrcpyA@8 = lstrcpyA
    136. lstrcpyW
    137. _lstrcpyW@8 = lstrcpyW
    138. lstrcpyn
    139. _lstrcpynA@12 = lstrcpyn
    140. lstrcpynA
    141. _lstrcpynA@12 = lstrcpynA
    142. lstrcpynW
    143. _lstrcpynW@12 = lstrcpynW
    144. lstrlen
    145. _lstrlenA@4 = lstrlen
    146. lstrlenA
    147. _lstrlenA@4 = lstrlenA
    148. lstrlenW
    149. _lstrlenW@4 = lstrlenW
    Для получения либов я использую polib.exe v. 5.0 из 10-й версии бесплатного пакета MASM32. Мелкософтовский lib.exe файл для построения универсальных либов использовать не стоит, с ним гороздо больше проблем.

    Может возникнуть вопрос. А как я получаю деф-файлы? Фактически, вся нужная мне информация находится в отладочных pdb-файлах. Их можно использовать напрямую (существует достаточно много кода для работы с pdb-форматом, но его еще нужно переварить), но проще всего, применяя собственный скрипт к дизассемблерному коду «Иды», с подгруженными отладочными символами.
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    1. не понял на счет 6.11 я пользуюсь 10 версией из Вижуал Си
    2. Это скорее ваша проблема, чем моя
    3. Насчет ординалов -- в примере импорт по имени функции, но если вам необходимо переделать в импорт по ординалам -- сделайте! А вот здесь вы правы -- одним и тем же именам функций в разных версиях системных dll соответствуют разные ординалы.
    Импорт по ординалам наверное подразумевает уменьшение размера ехе? Тогда есть примеры, как обойтись без импорта совсем -- Мессадж бокс в 97 байт и Каркас оконного приложения в 206 байтов
     
  5. Scholium

    Scholium New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2009
    Сообщения:
    96
    Это уже интересно! ml.exe у меня тоже из 10-й студии. Но link.exe v. 10.0 не поддерживает опцию /TINY, поэтому приходится использовать link16.exe 1995 года (из Masm32, v. 6.11). Или Вы компилируете без опции /TINY ?

    У меня проблем нет :) . Я использую универсальные либы и extrn директивы, как это и Вы делаете, в случае не экстремального программирования :) . Можно, конечно, вместо одной строки extrn написать несколько строчек собственного импорта, иногда это бывает полезно, но объем исходного кода не сокращает.

    Как раз по ординалам делать вызовы системных функций я не заинтересован, ибо ориентируюсь на различные версии виндозы.

    Согласен, Ваши примеры весьма показательны. Если вдруг надумаю писать внедряемый код :) , тогда буду заинтересован в его сверхкомпактности. А пока меня больше интересуют, скажем так, недокументированные возможности управления стандартными контролами, такими как SysListView32 и SysHeader32. Если Вы пожелаете использовать их в своих примерах, то буду весьма признателен за информацию об этом. Например, я работаю с их внутренними, не документированными структурами и областями данных для непосредственной манипуляции (изменение размеров, цветов, вывода разделительных линий и т.п.). Т.е. вместо того, чтобы писать свой собственный обработчик типа OnPaint, я просто меняю несколько байт недокументированных данных.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Очередной "урок Iczelion'a" -- M$Agent на ассемблере, работает под WinXP SP3, размер ехе 3200 байт (в аттаче сорц, ресурсы, inc и exe)
     
  7. IceBars

    IceBars New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2007
    Сообщения:
    384
    Адрес:
    Матрица
    Mikl___
    примеры конечно класные. Жаль что DirectIO.rar не работает.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    IceBars
    А на каком Windows вы DirectIO запускали? Я писал и проверял на WinXP SP3
     
  9. IceBars

    IceBars New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2007
    Сообщения:
    384
    Адрес:
    Матрица
    Я тестировал на лицензионной Windows 7 и XP. Если в системе не было какой-нибудь троянской программы то доступ к SeTcbPrivilege закрыт. Но так как у многих побывали троянцы, то скорее всего они оставляют доступ SeTcbPrivilege открытым. Поэтому у них DirectIO работает.
    Попробуйте установить с нуля лицензионную винду, и у вас тоже DirectIO работать не будет.
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    IceBars
    Попробую. А scp13-00 у вас работает?
     
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    .......я ничего не путаю, или уже в уроках было такое, помню в билдере кажись были примеры,
    окна неправильной формы, элипсоид типа, вообщем круглые, есть ли исходники? (fasm)

    Всё, уже нашёл!!
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Semiono
    Здесь пример вывода окна с закругленными краями, может быть пригодится
    А в аттаче пример вывода окна произвольной формы (сорц, ехе и рисунок)
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Semiono
    Окну устанавливается ограничивающий регион. Это сервис NtUserSetWindowRgn, есчо апи была для него. Прежде регион должен быть создан. При создании передаётся массив точек образующий регион. Для динамического создания этого массива по шаблону лучше всего использовать попиксельное описание контуров http://www.wasm.ru/forum/viewtopic.php?id=38446. Анимешки это иной механизм, многослойные окна http://msdn.microsoft.com/en-us/library/ms997507.aspx.
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Когда не надо бывает, из памяти вылетает, в блоге /PCL тоже было!
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Продолжаю опыты с MS Agent'ом на ассемблере. Для следующей программы вам потребуется файлы merlin.acs, genie.acs (по умолчанию они должны находится в папке Windows\msagent\chars) и скопируйте из папки Windows\srchasst\chars файл rover.acs в папку Windows\msagent\chars. Если почему-либо джина и Мерлина нет на вашей машине, то их можно скачать здесь http://www.microsoft.com/downloads/...4e-bc2d-4c1d-b5a0-3183fe206414&displaylang=en и здесь http://www.microsoft.com/downloads/...dd-2f23-41d0-8a81-2affd74c0aa5&displaylang=en вам также понадобятся компонент для произношения текстов (для русского языка) – http://speech-soft.ru/download/lhttsrur.exe и поддержка SAPI (нужна для произношения текстов) – http://speech-soft.ru/download/ms_speech_api.exe в аттаче находятся сорц, bmp для кнопок и ехе (6644 байта) работает под WinXP
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    MS Agent на ассемблере модифицированный. Для следующей программы вам потребуется файлы merlin.acs, genie.acs (по умолчанию они должны находится в папке Windows\msagent\chars) и скопируйте из папки Windows\srchasst\chars файл rover.acs в папку Windows\msagent\chars. Если почему-либо джина и Мерлина нет на вашей машине, то их можно скачать здесь http://www.microsoft.com/downloads/...4e-bc2d-4c1d-b5a0-3183fe206414&displaylang=en и здесь http://www.microsoft.com/downloads/...dd-2f23-41d0-8a81-2affd74c0aa5&displaylang=en вам также понадобятся компонент для произношения текстов (для русского языка) – http://speech-soft.ru/download/lhttsrur.exe и поддержка SAPI (нужна для произношения текстов) – http://speech-soft.ru/download/ms_speech_api.exe в аттаче находятся сорц, курсор-иконка, inc, bmp для кнопок и ехе (7812 байтов) работает под WinXP
     
  18. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    +1
    MS Agent - такие дебри! Порой элементарного не понятно бывает.
    Мне вот сейчас пацан дал код как консоль открыть по координатам в родительском окне,
    причём format PE Console, с которым проблемма была STARTUPINFO, вот это я понимаю! =)
    И парсинг люблю, регекспы... Примеров бы побольше. :)
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Semiono
    разрешите с вами не согласиться. MS Agent - это набор анимированных гифов, для запуска которого нужно просто указать название гифа в юникоде, например персонаж машет ручкой
    Код (Text):
    1.      push offset MSAg_szWave
    2.     push edi
    3.     call [edi].Play
    где MSAg_szWave du "Wave",0
    Либо хотите, чтобы персонаж произнес: "Привет!"
    Код (Text):
    1.    push offset TheText78;TheText78  db 'Привет!',0;
    2.     push edi;hMerlin
    3.     call [edi].Speak
    и, в зависимости от настроек, голос будет мужским, женским, детским, заикающимся и т.д. голос будет синтезироваться компьютером, причем вам это не будет стоить ни строчки кода
    хотите переместить персонаж по экрану из А в Б
    Код (Text):
    1.     push offset Request
    2.     push 1000
    3.     push 300
    4.     push 600
    5.     push edx;[edi].hAgentChar
    6.     mov edx,[edx]
    7.     assume edx: ptr IAgentCharacterEx
    8.     call [edx].MoveTo
    9.     assume edx: nothing
    где 600 - координата точки Б в пикселях по Х, 300 -- координата точки Б по Y, 1000 время перемещения из точки А в точку Б в миллисекундах...
    смотрите внимательно код, а разбираться с координатами консоли вам придется самому...
     
  20. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Если лезть в "мультимедиа" то не обязательно продукты майкрософт.
    Можно, например, какуюнибудь фитчу в Directory Opus программировать.
    Или вообще в Steinberg Cubase залезть.
    Я просто MS Agent твикнул у себя. :)
    Не, всё нормально, это я подзадориваю, чтоб веселее было.
    Но коммандная строка, grep, sed, regexp, скрипты, файлы, это всегда актуально... :)