Не хочу возиться с полным переносом asm программы на Си. Подключаю нужный файл в проекту, заменяю start: на Код (Text): .code PUBLIC _cleanoff _cleanoff PROC NEAR ; здесь был start: ; ... _cleanoff endp У меня VC6, так что добавил файл, в настройках настроил компиляцию (С:\masm32\bin\ml.exe /c /coff /nologo $(InputPath) \ .\$(InputName).obj) Файл собирается в объектник без проблем. Теперь хочу вызвать его из x.cpp В шапке extern "C" void cleanoff (); вызов cleanoff(); При линковке x.obj x.obj : error LNK2001: unresolved external symbol _cleanoff Release/x.exe : fatal error LNK1120: 1 unresolved externals Что забываю? Что не так?
Freecod Одно из двух, либо что-нибудь с манглами либо не подрубил либу. Не знаю как в VC6, но в 2003 в опциях линкера -Additional dependencies.
А что добавляем сообственно в Additional dependencies? Есть Dependencies с возможностью добавки на вкладке Custom Build (свойства файла *.asm в проекте). У cpp файла зависимости не изменяются... статейки про это нет, хотя бы на 2003 VC?
Хм, когда я в 2005-2008 студии подключал asm-файл к проекту, достаточно было объявить в нем ее как PUBLIC, а в сишном коде просто по имени вызывать, типа так: Код (Text): .... PUBLIC INT3 ... Код (Text): extern "C" { void INT3(); .... } ..... INT3();
Сторонний вопрос, чтоб не создавать лишнюю тему - половина мегабайта, 524288 байт всегда будет выровненным размером? Или может код небольщой подскажите для вычисления ближайшего к полумегабайту выровненного размера? Нужно для MapViewOfFile, двигаю окно, а оно только на выровненный размер сдвигается...
Freecod MapViewOfFile ... только на выровненный размер сдвигается Речь о SYSTEM_INFO.dwAllocationGranularity?
Можно поподробнее? Да, требуется такой размер, близкий к полмегабайта, на который можно сдвигать MapViewOfFile.
Freecod Код (Text): ... static DWORD WINAPI GetPageSize(void) { SYSTEM_INFO si; GetSystemInfo(&si); return si.dwAllocationGranularity; } ... DWORD half = 512 * 1024 * 1024; DWORD size = GetPageSize(); DWORD result = ((half >= size) ? half - (half % size) : size); ...
Для MASM и VC++ я делал так: В def файле: Код (Text): LIBRARY Example EXPORTS needed_proc ; подставить свою Далее bat'ник для сборки: Код (Text): set cmpl=X:\masm32 %cmpl%\bin\ml /nologo /c /coff /Cp /I%cmpl%\include\ lib.asm %cmpl%\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%cmpl%\lib /DLL /DEF:lib.def lib.obj %cmpl%\bin\link -lib lib.obj del *.exp del *.obj pause Далее вызов подключение и вызов из программы на С++: Код (Text): #pragma comment (lib, "lib.lib") extern "C" { void _stdcall needed_proc(/* parameters list */); } int main(int argc, char* argv[]) { needed_proc(/* parameters list */); return 0; }
Отлично, всё работает как задуманно, спасибо =) PS Пришёл к выводу, вставив тот же файл в проект на vs2003 - VC6 не хочет нормально использовать паблик функции.
Наткнулся на странную проблему - подключаю lib, вызываю функцию, (кстати, этот асм-файл это отключение WFP из одной из статей от зелёного к красному) и после этого вызываю DeleteFile (удаляю обычный не относящийся к wfp файл), а у функции на входе int 3 \ ret. Что такое?