Экспорт

Тема в разделе "WASM.ASSEMBLER", создана пользователем qweasd, 11 мар 2011.

  1. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    Привет всем
    У меня такой вопрос:

    Есть dll, которая имеет экспортную функцию с таким именем: ??1INIFile@@QAE@XZ

    Я хочу создать новую dll на masm32 с такой же функцией, но не знаю, как её правильно назвать

    В emul.def пишу:
    ~...~
    EXPORTS ??1INIFile@@QAE@XZ
    ~...~

    В emul.asm:
    ~...~
    ??1INIFile@@QAE@XZ proc STDCALL
    ret
    ??1INIFile@@QAE@XZ endp
    ~...~

    Пытаюсь скомпилировать, пишет "error LNK2001: unresolved external symbol "public: __thiscall INIFile::~INIFile(void)" (??1INIFile@@QAE@XZ)"

    Подскажите, как объявить эту функцию, чтобы новая dll-ка скомпилировалась нормально и при этом функция имела имя ??1INIFile@@QAE@XZ


    Пробовал делать так:
    В emul.def пишу:
    ~...~
    EXPORTS ??1INIFile@@QAE@XZ = inifile
    ~...~

    В emul.asm:
    ~...~
    inifile proc STDCALL
    ret
    inifile endp
    ~...~

    Компилится нормально, НО имя функции выглядит так: ??1INIFile
    Компилятор зачем-то обрезает имя до символа "@"
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    юзайте фасм
     
  3. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    попробуй так: забей место каким-нибудь словом по размеру ??1INIFile@@QAE@XZ, а потом в 16чном редакторе подправишь или ещё в какой-нить утилите
     
  4. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    GoldFinch
    В фасме скомпилилось нормально, но я не умею в нём работать и не смог найти для него нормальной справочной системы по встроенным функциям, как в масме, а кода разного там будет немало

    kernel16
    Не хотелось прибегать к такому неудобному решению, но, видимо, выбора нет, придётся заменить символы "@" какими-нибудь другими символами, а после компиляции тупо пропатчить
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    с фасмом идет help, или на сайте выложен pdf, также есть перевод на русский
     
  6. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    qweasd
    А ты не забыл объявить прототип в файле emul.asm?:

    ??1INIFile@@QAE@XZ PROTO STDCALL

    Компилится то нормально, но символ ??1INIFile@@QAE@XZ не объявлен как внешний (PROTO как раз делает это), вот линкер его и не видит.
     
  7. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    LShadow77
    Конечно, объявил (просто здесь не написал)

    Компилится только в одном случае - когда меняю имя функции в .def (про это в первом сообщении), но и то имя получается не полностью
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qweasd
    Ошиблись, надо писать так.
    Код (Text):
    1. EXPORTS ??1INIFile@@QAE@XZ = _inifile@0
    Если конечно inifile с нулевым кол-вом параметров.

    З.Ы При неверном имени, линковщик походу считает символ @ за признак ординала, или что-то в этом духе и обрезает псевдоним. ^)
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    для масма:
    сотри stdcall в директиве model
    а во всех прототипах добавь
    это даст возможность управлять манглингом
    я про это писал, но щас не нашел
     
  10. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    Booster
    Та же самая ошибка

    Rockphorr
    Если удалить stdcall из строки .model, выдаёт кучу ошибок:
    error A2119: language type must be specified
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qweasd
    Какая именно?
     
  12. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    Booster
    error LNK2001: unresolved external symbol "public:
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qweasd
    Где ошибка? При сборке библиотеки или при линковке в другой проект?
     
  14. qweasd

    qweasd New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    7
    Booster
    При компиляции библиотеки.

    Я думаю, можно закрыть тему.

    Длл-ку я собрал, после чего имена экспортных фунок пропатчил на нужные. Всё работает.
    Единственное, что неудобно, - приходится патчить экспорт после каждой компиляции.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Можно уже и утиль написать для автоматизации
     
  16. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Asterix
    если уж на то пошло, то можно было б уже воспользоваться другим компилятором или линкером.
    например, попробовать расшифровать это С++ имя и заглушку написать на С++
    ов позволяет вручную манглить имена, а линкер его позволяет во время линковки переименовывать экспорт.
    тот же фасм, вроде, не делает предположений насчет имен
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ну если религия не позволяет другой компилятор/линкер использовать
     
  18. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    qweasd
    в прототипах добавили stdcall ???
    нет конечно - именно про это вам и говорит компилятор - error A2119: language type must be specified
     
  19. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    в masm вместо link.exe используй polink.exe (оба идут в одной сборке, например "masm32 v10")
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qweasd
    Да блин, какая ещё ошибка?
    Код (Text):
    1. EXPORTS ??1INIFile@@QAE@XZ = _inifile@0
    2. ~...~
    3.  
    4. В emul.asm:
    5. ~...~
    6. inifile proc STDCALL
    7. ret
    8. inifile endp
    9. ~...~
    Всё отлично собирается и имя именно - ??1INIFile@@QAE@XZ