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.
[C] Svet(R)off