none
изменение имени в таблице импорта dll RRS feed

  • Вопрос

  • Есть основной exe, скомпилированный на Borland. Ведет себя помимо прочего как dll т.е. имеет таблицу экпорта символов для вызова в плагинах. Экспортирует, скажем, int MyFunc(int Arg1) типа вызова stdcall т.е. в таблице экспорта стоит  имя MyFunc (потому что Borland). Имеется также хеадер на эту ф-цию:

    extern "C" __declspec(dllimport) int __stdcall MyFunc(int Arg1);

    Дальше, есть dll - сам плагин. Скомпилирован в vc++ studio 2010. При вызове MyFunc из него генерирует в своей таблице импорта имя MyFunc@4 (потому что stdcall). Естественно, плагин не коннектится, поскольку таблица импортов в dll-ке не заполняется.

    Короче, хочу чтобы MyFunc оставалась stdcall (т.е. при компилировании компилятор не чистил дополнительно стек на эти самые 4 байта) а также генерировало имя "MyFunc" в своей таблице импорта.

    P.S. Знаю, что проблема несовместимости имен борланда и микрософта древняя как мир, но может к 2012 году как-то автоматизировали это...

    4 апреля 2012 г. 17:53

Ответы

Все ответы

  • Здравствуйте.

    Borland предоставляет утилиту для конвертирования библиотек, созданных в Visual Studio  в совместимый с борландским. Эта утилита называется  COFF2OMF.EXE, the Import Library Conversion Tool

    Надеюсь она вам подойдет.


    Для связи [mail]

    5 апреля 2012 г. 7:08
  • Нет, мимо(как и борландовская implib.exe). Мне не в проекте борланда нужно микрософтовскую 3-party линковать, а наоборот. Я хочу, чтобы микрософтовский линкер отработал правильно. Вот, что я сделал, чтобы по идее это сработало:

    1) сгенерировал def-файл через dumpbin.exe (можно и борландовскую impdef.exe - результат аналогичен).

    Естественно, в исходном def-файле вышла строка

    MyFunc.


    Учитывая, что с stdcall нужно повозиться и узнав правила самого экспорта/импорта, написал в своем def-файле:

    LIBRARY     ThemBorland3Party.EXE
    MyFunc@4=MyFunc

    стравил на lib.exe, и  микрософтовский линкер остался доволен: он узнал, из какого модуля тянуть сгенерированное компилятором MyFunc@4. Осталась проблема, что в этой самой таблице импорта написано. По идее там должно было быть два имени: MyFunc@4 и MyFunc, причем первое должно ссылаться на второе. Вместо этого в секции idata я вижу только MyFunc@4. Вот какого спрашивается и что мне нужно сделать, чтобы имени было два?



    • Изменено icegood 5 апреля 2012 г. 23:26 грамматика
    5 апреля 2012 г. 8:59
  • Нужно было забить на имена и пользоваться ординалами:

    http://stackoverflow.com/questions/2393178/creating-an-msvc-import-library-from-a-dll-that-uses-stdcall

    • Помечено в качестве ответа Abolmasov Dmitry 9 апреля 2012 г. 10:27
    6 апреля 2012 г. 14:51