Здравствуйте. Возможно ли процедурой одной своей библиотеки использовать процедуру другой свой библиотеки? При запуске приложения выдаёт ошибку 0xc0000018. Что делаю не так? Обязательно использовать LoadLibrary? Заранее спасибо!
Ясен пень что возможно, LoadLibrary используются при динамической линковке библиотеки, если же она линкуется статически то вызывать эту функцию не надо. Лучше всего для второй dll создать файл lib (во время создания указать такую опцию), и во время создания первой прописать функции из второй как dllimport (только прототипы и присоединить файл lib линкеру а то он будет ругацца). А можно через LoadLibrary и GetProcAddres - т.е. динамически. Вообще есть и другие варианты...но эти два - самые простые. Вы бы хоть код привели (того места где вызываются методы из другой длл), который у вас линкуется и при запуске выдает эту самую ошибку
А 1.zip не скачивается? У меня всё ассемблируется и линкуется (файлы lib создаю). А вот запускаться не хочет. С dllimport не понял, но у меня всё линкуется без ругани. dll1.asm: public _proc1@0 .686 .model flat code segment dword public use32 'CODE' _main@12: mov eax,1 ret 12 _proc1@0: mov eax,1234h ret code ends end _main@12 dll2.asm: public _proc2@0 includelib dll1.lib extrn __imp__proc1@0:dword .686 .model flat code segment dword public use32 'CODE' _main@12: mov eax,1 ret 12 _proc2@0: mov eax,4321h call __imp__proc1@0 nop ret code ends end _main@12 proba.asm: includelib kernel32.lib includelib dll1.lib includelib dll2.lib extrn __imp__ExitProcess@4:dword extrn __imp__proc1@0:dword extrn __imp__proc2@0:dword .386 .model flat CODE segment dword public use32 'CODE' _start: mov eax,1111h call __imp__proc1@0 push eax call __imp__ExitProcess@4 call __imp__proc2@0 CODE ends end _start
Проблема оказалась даже не в вызове dll из dll, а в использовании двух самодельных библиотек одновременно. Может проблема в параметрах компиляции? компиляция dll: ml.exe /c /coff /Cp /Fl name.asm link32.exe name.obj /DEF:name.def компиляция exe: ml.exe /c /coff /Cp /Fl name.asm link32.exe name.obj /subsystem:windows Вот содержание одного из def файлов: LIBRARY "dll1.dll" EXPORTS proc1
Оказалось, что проблема крылась в одинаковых базовых адресах загрузки моих библиотек (адреса были по дефолту). В одной из библиотек в def-файле вписал: LIBRARY "dll2.dll" BASE=0x20000000 (по умолчанию BASE=0x10000000) и всё заработало. Отсюда возник вопрос: получается необходимо отслеживать базовые адреса или есть другие варианты?
Другие варианты-это не извращаться и писать на Си с использованием IDE. На кой вам сдался на данном этапе асм? По идее пофигу какой там адрес вы вписали, потому что должны быть релоки. Ох уж эти асмеры...
Ну вообще-то при создании библиотек необходимо указывать ключ компиляции типа такого --enable-auto-image-base. Никогда не думал что можно столкнуться с проблемой одновременной загрузки двух библиотек по одному адресу. Думал все подгружаются по image base а если не удалось то на первое свободное место и с помощью релоков настраиваюца...Хм..теперь буду знать.
Да, вы правы. Я забыл ключ /DLL при линковке добавить. С ним всё нормально работает. Просто пример строки линковки брал для lnk-файла (там /DLL в самом файле находится), а сам использовал def-файл.