Ошибки при вызове функций API из ассемблерных приложений — Архив WASM.RU
Код (Text):
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:
Код (Text):
--------------------------------------------------------------------- Рабочая среда: 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:
Код (Text):
--------------------------------------------------------------------- Hehehehhhehehhehheheh ;) Мне бы очень понравился такой синтаксис, но вы переоцениваете возможности ассемблера... если только вы не определили макрос MessageBox, вы не можете вызывать его с текстом в кавычках! И даже если вы сделали нечто подобное, вы не включили в строки завершающий ноль. так что следовало бы поступить так: INVOKE MessageBox, NULL, addr msg_ok, addr msg_test, MB_OK Попробуйте.. Я гарантирую, что это будет работать... Sincerely X. ---------------------------------------------------------------------  Min:
Код (Text):
--------------------------------------------------------------------- Спасибо за ответ. Но оно по-прежнему не работает :( .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:
Код (Text):
--------------------------------------------------------------------- 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:
Код (Text):
--------------------------------------------------------------------- Thank you very much. Оказывается, MASM611 содержит include-файл для win3.1! Поэтому я скачал пакет MASM32 - и все заработало. Regards, Min ---------------------------------------------------------------------  Randall Hyde:
Код (Text):
--------------------------------------------------------------------- Если вам действительно нравится такой синтаксис, переходите на HLA (High Level Assembler). Он позволит вам писать код, подобный следующему: MessageBox( MB_OK, "test", "ok", NULL ); (параметры перечислены в обратном порядке, потому что HLA использует соглашения вызова Паскаля, а не C/C++. Вы можете использовать макрос для устранения этой проблемы, если она для вас существенна). HLA будет автоматически размещать строки в памяти "только для чтения" и предоставлять вам адреса таких строк. Вы можете найти HLA на http://webster.cs.ucr.edu Randy Hyde ---------------------------------------------------------------------  Наша точка зрения изложена в статье Вызов функций API. © Svet(R)off
Ошибки при вызове функций API из ассемблерных приложений
Дата публикации 14 июн 2002