Як створити бібліотеку імпорту для існуючої dll - stack overflow російською

Є кілька DLL, потрібно використовувати функції з них в проекті на Сі ++. Доступу ні до ісходникам ні до розробників у мене немає. Тобто в наявності просто набір DLL як вешь в собі і документ з описом інтерфейсу до них.

заданий 24 Вересня '15 о 15:31

В принципі, це підтримуваний сценарій: наприклад, функції можуть бути декоровані нестандартним чином, або мати нетрадиційне угоду про виклик.

Але тим не менше, якщо ви знаєте точну сигнатуру функцій, то можна спробувати зробити, як описано тут.

Ідея №1: створити DEF-файл вручну. Це підійде, якщо функції, які ви імпортуєте, є C-функції, і ви знаєте їх calling convention (наприклад, __cdecl або PASCAL (__stdcall)).

Для початку, встановимо, що це за функції. Для цього можна скористатися стандартною утилітою dumpbin з ключем / exports (не забувайте, що її потрібно запускати з-під Visual Studio command prompt) або дуже корисною при нативной розробці під Windows-платформу утилітою depends.exe.

Для dumpbin ви отримаєте приблизно такий висновок:

Звідси ви берете імена функцій: AnalyseW. CloseAnalyseW і т. Д. І перетворюєте їх в .def-файл:

Так працює для функцій з calling convention __cdecl (вона зазвичай прийнята за замовчуванням). Для інших ви повинні задекорувати ім'я функції самостійно, згідно з таблицею:

(Число після @ означає кількість байт в стеці, що відводиться під параметри).

Тепер можна використовувати команду lib /def:yourfile.def з командного рядка Visual Studio, щоб побудувати .exp і .lib для лінковки.

Ідея №2 - це створити фейк-бібліотеку з такими ж сигнатурами функцій, побудувати її, і використовувати її .exp і .lib замість відсутніх. Для цього вам доведеться побудувати С- (або гірше того, C ++ -) сигнатури потрібних функцій. Для сішних функцій (ну або тих, які були визначені як extern "C" в исходнике) це просто: ви дивитеся на декороване ім'я (наприклад, в тому ж depends.exe або dumpbin), визначаєте по таблиці зверху їх calling convention, і кладете таку функцію в исходник. Не забудьте вказати __declspec (dllexport) для всіх, і додатково extern "C" для сішних функцій. Реалізуйте функції як завгодно, щоб компілятор скомпілював це.

Якщо у вас декоровані C ++ - сигнатури (вони виглядають якось так. Test @@ YGXXZ) їх можна перетворити в правильні C ++ - декларації за допомогою утиліти undname:

Якщо у вас є header, що йде з бібліотекою, то нічого вгадувати (з ризиком помилитися і отримати креш) не треба, просто візьміть прототипи функцій звідти (тільки не забудьте поміняти __declspec (dllimport) на __declspec (dllexport)).

Скомпілюйте отриманий файл в .obj за допомогою команди

Ключ / c потрібен, щоб компілятор справив .obj, а / Ob0 - щоб не занілайніл випадково якісь функції, які йому здадуться непотрібними (це може бути потрібно в разі експорту класів, і в жодному разі не зашкодить).

Маючи .obj, ви можете отримати .lib і .def за допомогою команди

Схожі статті