Лучший отвечающий
изменение имени в таблице импорта dll

Вопрос
-
Есть основной 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
Ответы
-
Нужно было забить на имена и пользоваться ординалами:
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
Все ответы
-
Здравствуйте.
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