Ошибки при вызове функций API из ассемблерных приложений

Дата публикации 14 июн 2002

Ошибки при вызове функций API из ассемблерных приложений — Архив WASM.RU

Код (Text):
  1.  
  2.      Date: 17-24 ноября 1999
  3. Newsgroup: microsoft.public.masm
  4.   Subject: How to call win32 API? (Как вызвать win32 API?)
  5.  
  6. Участвуют: Min           minwang@hotmail.com
  7.            Xaphiosis     void_s@ihug.com.au
  8.                          Organization: The Internet Group Ltd
  9.            Randall Hyde  rhyde@shoe-size.com
  10.  

  Min:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Рабочая среда: VC6.0/MASM6.11/NT Server 4.0
  4.  
  5.    .386
  6.    .MODEL flat, stdcall
  7.    PUBLIC _start
  8.    .DATA
  9.    .CODE
  10.    _start:
  11.     INVOKE MessageBox, NULL, "ok", "test", MB_OK
  12.    END _start
  13.  
  14.  
  15. Получаю сообщение: error A2004: symbol type conflict
  16. Также пробую MessageBoxA/MessageBoxW, бесполезно.
  17. Есть идеи?
  18.  
  19. Regards,
  20. Min
  21. ---------------------------------------------------------------------
  22.  

  Xaphiosis:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Hehehehhhehehhehheheh ;)
  4.  
  5. Мне бы очень понравился такой синтаксис, но вы переоцениваете
  6. возможности ассемблера... если только вы не определили макрос
  7. MessageBox, вы не можете вызывать его с текстом в кавычках!
  8. И даже если вы сделали нечто подобное, вы не включили в строки
  9. завершающий ноль.
  10.  
  11. так что следовало бы поступить так:
  12.  
  13. INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  14.  
  15. Попробуйте.. Я гарантирую, что это будет работать...
  16.  
  17. Sincerely
  18. X.
  19. ---------------------------------------------------------------------
  20.  

  Min:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Спасибо за ответ. Но оно по-прежнему не работает :(
  4.  
  5.    .386
  6.    .MODEL flat, stdcall
  7.    include win.inc
  8.    PUBLIC _start
  9.    .DATA
  10.    ALIGN DWORD
  11.    msg_ok BYTE "ok",0
  12.    msg_test BYTE "test",0
  13.    .CODE
  14.    _start:
  15.     INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  16.    END _start
  17.  
  18. Сообщение об ошибке: "error A2004: symbol type conflict"
  19.  
  20. Regards,
  21. Min
  22. ---------------------------------------------------------------------
  23.  

  Xaphiosis:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Alright... Я быстренько откомпилировал ваш код на своей системе...
  4. Напоминаю, если вы забыли:
  5. OPTION CASEMAP:NONE
  6. включает чувствительность к регистру, иначе win.inc не работает
  7.  
  8. кроме того, после MessageBox, мне кажется, вы должны вызвать
  9. ExitProcess (правда, это не влияет на компиляцию)
  10.  
  11. Наконец, я думаю, следует проверить возможность того, что ваш
  12. win.inc дефектен (довольно сомнительно)
  13.  
  14. В любом случае, вот код, который я использовал:
  15. Попробуйте и убедитесь, что он работает ;)
  16.  
  17.    .386
  18.    .MODEL FLAT, STDCALL
  19.    OPTION CASEMAP:NONE
  20.  
  21.    include <my equivalent of win.inc = various files>
  22.    PUBLIC _start
  23.  
  24.    .DATA
  25.    ALIGN DWORD
  26.    msg_ok BYTE "ok",0
  27.    msg_test BYTE "test",0
  28.  
  29.    .CODE
  30.    _start:
  31.     INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
  32.     call ExitProcess        ;EXIT POINT
  33.    END _start
  34.  
  35. Sincerely,
  36. X.
  37. ---------------------------------------------------------------------
  38.  

  Min:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Thank you very much.
  4.  
  5. Оказывается, MASM611 содержит include-файл для win3.1!
  6. Поэтому я скачал пакет MASM32 - и все заработало.
  7.  
  8. Regards,
  9. Min
  10. ---------------------------------------------------------------------
  11.  

  Randall Hyde:

Код (Text):
  1.  
  2. ---------------------------------------------------------------------
  3. Если вам действительно нравится такой синтаксис, переходите на HLA
  4. (High Level Assembler).
  5. Он позволит вам писать код, подобный следующему:
  6.  
  7.     MessageBox( MB_OK, "test", "ok", NULL );
  8.  
  9. (параметры перечислены в обратном порядке, потому что HLA использует
  10. соглашения вызова Паскаля, а не C/C++. Вы можете использовать
  11. макрос для устранения этой проблемы, если она для вас существенна).
  12.  
  13. HLA будет автоматически размещать строки в памяти "только для
  14. чтения" и предоставлять вам адреса таких строк.
  15. Вы можете найти HLA на http://webster.cs.ucr.edu
  16.  
  17. Randy Hyde
  18. ---------------------------------------------------------------------
  19.  

  Наша точка зрения изложена в статье Вызов функций API. © Svet(R)off


0 1.010
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532