Вызов dll из dll

Тема в разделе "WASM.WIN32", создана пользователем Gennadiy_M, 15 апр 2011.

  1. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Здравствуйте. Возможно ли процедурой одной своей библиотеки использовать процедуру другой свой библиотеки?

    При запуске приложения выдаёт ошибку 0xc0000018. Что делаю не так? Обязательно использовать LoadLibrary?

    Заранее спасибо!
     
  2. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Ясен пень что возможно, LoadLibrary используются при динамической линковке библиотеки, если же она линкуется статически то вызывать эту функцию не надо. Лучше всего для второй dll создать файл lib (во время создания указать такую опцию), и во время создания первой прописать функции из второй как dllimport (только прототипы и присоединить файл lib линкеру а то он будет ругацца). А можно через LoadLibrary и GetProcAddres - т.е. динамически. Вообще есть и другие варианты...но эти два - самые простые. Вы бы хоть код привели (того места где вызываются методы из другой длл), который у вас линкуется и при запуске выдает эту самую ошибку
     
  3. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    А 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
     
  4. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Проблема оказалась даже не в вызове 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
     
  5. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Оказалось, что проблема крылась в одинаковых базовых адресах загрузки моих библиотек (адреса были по дефолту). В одной из библиотек в def-файле вписал:

    LIBRARY "dll2.dll" BASE=0x20000000

    (по умолчанию BASE=0x10000000) и всё заработало.

    Отсюда возник вопрос: получается необходимо отслеживать базовые адреса или есть другие варианты?
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Другие варианты-это не извращаться и писать на Си с использованием IDE. На кой вам сдался на данном этапе асм?
    По идее пофигу какой там адрес вы вписали, потому что должны быть релоки.
    Ох уж эти асмеры...
     
  7. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Ну вообще-то при создании библиотек необходимо указывать ключ компиляции типа такого --enable-auto-image-base. Никогда не думал что можно столкнуться с проблемой одновременной загрузки двух библиотек по одному адресу. Думал все подгружаются по image base а если не удалось то на первое свободное место и с помощью релоков настраиваюца...Хм..теперь буду знать.
     
  8. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Да, вы правы. Я забыл ключ /DLL при линковке добавить. С ним всё нормально работает.

    Просто пример строки линковки брал для lnk-файла (там /DLL в самом файле находится), а сам использовал def-файл.
     
  9. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Ну а в чёмже есчо:
    #define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018L)
     
  10. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    Ага! Сплойты значит пишемс!