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

Все статьи

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

     Date: 17-24 ноября 1999 
Newsgroup: microsoft.public.masm 
  Subject: How to call win32 API? (Как вызвать win32 API?) 

Участвуют: Min           minwang@hotmail.com
           Xaphiosis     void_s@ihug.com.au 
                         Organization: The Internet Group Ltd
           Randall Hyde  rhyde@shoe-size.com

  Min:

---------------------------------------------------------------------
Рабочая среда: VC6.0/MASM6.11/NT Server 4.0

   .386
   .MODEL flat, stdcall
   PUBLIC _start
   .DATA
   .CODE
   _start:
    INVOKE MessageBox, NULL, "ok", "test", MB_OK
   END _start


Получаю сообщение: error A2004: symbol type conflict
Также пробую MessageBoxA/MessageBoxW, бесполезно.
Есть идеи?

Regards,
Min
---------------------------------------------------------------------

  Xaphiosis:

---------------------------------------------------------------------
Hehehehhhehehhehheheh ;)

Мне бы очень понравился такой синтаксис, но вы переоцениваете 
возможности ассемблера... если только вы не определили макрос 
MessageBox, вы не можете вызывать его с текстом в кавычках!
И даже если вы сделали нечто подобное, вы не включили в строки
завершающий ноль.

так что следовало бы поступить так:

INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK

Попробуйте.. Я гарантирую, что это будет работать...

Sincerely
X.
---------------------------------------------------------------------

  Min:

---------------------------------------------------------------------
Спасибо за ответ. Но оно по-прежнему не работает :(

   .386
   .MODEL flat, stdcall
   include win.inc
   PUBLIC _start
   .DATA
   ALIGN DWORD
   msg_ok BYTE "ok",0
   msg_test BYTE "test",0
   .CODE
   _start:
    INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
   END _start

Сообщение об ошибке: "error A2004: symbol type conflict"

Regards,
Min
---------------------------------------------------------------------

  Xaphiosis:

---------------------------------------------------------------------
Alright... Я быстренько откомпилировал ваш код на своей системе...
Напоминаю, если вы забыли:
OPTION CASEMAP:NONE
включает чувствительность к регистру, иначе win.inc не работает

кроме того, после MessageBox, мне кажется, вы должны вызвать
ExitProcess (правда, это не влияет на компиляцию)

Наконец, я думаю, следует проверить возможность того, что ваш
win.inc дефектен (довольно сомнительно)

В любом случае, вот код, который я использовал:
Попробуйте и убедитесь, что он работает ;)

   .386
   .MODEL FLAT, STDCALL
   OPTION CASEMAP:NONE

   include <my equivalent of win.inc = various files>
   PUBLIC _start

   .DATA
   ALIGN DWORD
   msg_ok BYTE "ok",0
   msg_test BYTE "test",0

   .CODE
   _start:
    INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK
    call ExitProcess        ;EXIT POINT
   END _start

Sincerely,
X.
---------------------------------------------------------------------

  Min:

---------------------------------------------------------------------
Thank you very much.

Оказывается, MASM611 содержит include-файл для win3.1!
Поэтому я скачал пакет MASM32 - и все заработало.

Regards,
Min
---------------------------------------------------------------------

  Randall Hyde:

---------------------------------------------------------------------
Если вам действительно нравится такой синтаксис, переходите на HLA
(High Level Assembler).
Он позволит вам писать код, подобный следующему:

    MessageBox( MB_OK, "test", "ok", NULL );

(параметры перечислены в обратном порядке, потому что HLA использует
соглашения вызова Паскаля, а не C/C++. Вы можете использовать
макрос для устранения этой проблемы, если она для вас существенна).

HLA будет автоматически размещать строки в памяти "только для
чтения" и предоставлять вам адреса таких строк.
Вы можете найти HLA на http://webster.cs.ucr.edu

Randy Hyde
---------------------------------------------------------------------

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

2002-2013 (c) wasm.ru