Подтвердить что ты не робот

Преобразование Windows Dll в .lib для С++ Visual Studio 2008

Я знаю, что есть инструмент под названием Dll для lib, но разработчик запрашивает 1000 долларов. Мне нужно только один раз конвертировать одну библиотеку, поэтому ее нелегко оправдать этой ценой.

Я попробовал IMPLIB32.EXE, но я просто получаю пустые .lib файлы. Как я могу это сделать? Возможно, я могу написать простое приложение конверсии?

Added1:

Dll обычно stdcall не cdecl и написаны на более старых C, как языки NOT С# или .NET или С++. Теперь мне нужно вызвать их из приложений на С++. Примером может служить файл SQLite.dll или zlib.dll. У меня нет доступа к файлам .lib для этих dll.

Added2:

Я переписал этот код для VS2008 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/ и включил пример Dll etc, загружаемый здесь: http://www.transferbigfiles.com/Get.aspx?id=7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a Это, в свою очередь, делает проект, создающий Dll. Когда я пытаюсь скомпилировать Dll, я получаю ошибку компоновщика: AddShow.dll: фатальная ошибка LNK1107: недопустимый или поврежденный файл: не может читать на 0x300 Описанный здесь: http://list.isis.vanderbilt.edu/pipermail/udm-users/2006-March/000664.html Не уверен, как действовать дальше. Так близко еще пока

Далее мы переходим к этому методу

http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

Запуск dumpbin с аргументом/экспортом C:\path\to\AddShow.dll абсолютно ничего После некоторых исследований

http://msdn.microsoft.com/en-us/library/aa446532.aspx кажется, что mspdb71.dll(теперь mspdb80.dll) требуется из общей папки /ide dumpbin.exe теперь работает с ошибкой:

фатальная ошибка LNK1106: недопустимый файл или диск: не удается найти 0x6179A Эти потоки предполагают, что версия dumpbin.exe может быть проблемой

У меня есть Microsoft (R) COFF/PE Dumper Version 9.00.30729.01

Итак, я попробовал Microsoft (R) COFF Binary File Dumper Version 5.12.8078 без успеха. После большого чтения я не ближе

http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal-error-lnk1106-invalid-file-disk-full.html

Когда я запускаю ProcMon, я вижу первое обнаружение queryopen и sqlite3.dll, когда svchost.exe пытается открыть его и с ошибкой PATH NOT FOUND. путь - C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL и является правильным. Если я положил его в корень диска C, я получаю ошибки NAME NOT FOUND:

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local

из link.exe и dumpbin.exe уважительно. Я использую XPSP3 не Vista, и это касается предела моих знаний о sysinternals. что это за файлы .local?

(csrss.exe также не может найти несколько файлов манифеста.)

Так что успеха пока нет, просто больше тайны

Добавлено 3:

Я попытался запустить dumpbin.exe из его установленного местоположения, \Program Files\Microsoft Visual Studio 8\VC\bin, но ОС сообщила, что не может найти mspdb80.dll. Я скопировал mspdb80.dll из \Program Files\Microsoft Visual Studio 8\Common7\IDE, чтобы попытаться запустить dumpbin.exe.

теперь я получаю ошибку: "Неисправность менеджера баз данных программы c1902, пожалуйста, проверьте свою установку"

Если я удалю mspdb80.dll из \Program Files\Microsoft Visual Studio 8\VC\bin, ошибка исчезнет! но я не могу запустить dumpbin.exe.

Добавлено 4:

Наконец, я смог запустить dumpbin, скопировав следующие файлы в папку:

dumpbin.exe link.exe lib.exe mspdb80.dll

Я получил ошибку:

фатальная ошибка LNK1248: размер изображения (FFFFFXXX) превышает максимально допустимый размер  (80000000)

один раз, но заменив dll исправлено. Предположительно, он был поврежден?

Затем я перешел к следующему шагу в инструкциях: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://support.microsoft.com/kb/131313 и получил ошибку: предупреждение lnk4017 выражение не поддерживается для целевой платформы игнорируется Это оказывается потому, что я задал .dll вместо файла .def.

Полученные файлы .Lib и .exp затем добавляются в проект VS2008, компилируются и запускаются. Затем отладчик сообщил об ошибке: Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено в вызове функции...

Как упоминалось здесь "Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено в вызове функции" после успешного обратного вызова С# из кода С++ GameSpy lib это потому, что я использовал stdcall в своей dll и объявил __cdecl в своем приложении.

extern "C" { // put Dll C function prototypes here
 int __cdecl AddTwoNum(int n, double f); // __stdcall
}

Итак, изменив это на __stdcall, вы должны исправить это, вы бы подумали.. но, увы, нет.

теперь я получаю ошибку связывания: ошибка LNK2001: неразрешенный внешний символ _AddTwoNum @12

Это имя украшенной функции по какой-либо причине. Почему?

Добавлено n:

Ну, это оказалось потому, что файл .lib был создан с использованием dll, который с функциями STDCALL. STDCALL запрашивает вызывающего абонента для очистки стека, поэтому количество байтов аргументов добавляется к имени функции с знаком @. В этом случае у меня было три 4-байтных интегратора для всего 12 байтов.

Как только я переделаю файл .lib из dll, созданного с помощью соглашения о вызове CDECL, все было хорошо.

4b9b3361

Ответ 1

Я не могу прокомментировать его ответ (мне нужна больше репутации?), но вы можете попробовать использовать мой . dll wrapper generator для создания заглушки .dll iain.

Ответ 2

Я предполагаю, что вы хотите вызвать некоторые функции/методы в dll в C/С++, не имея доступа к файлу lib для связи с ним.

Если вам известны подписи необходимых вам функций, вы можете:

  • создайте собственную версию dll dll
  • создать проект dll с тем же именем, что и dll, который вы хотите использовать
  • добавить функции-заглушки функций, которые вы хотите вызвать
  • Подписи очень важны, чтобы использовать depend.exe или dumpbin.exe для проверки соответствия.
  • затем напишите/создайте свою программу для ссылки на dll dll
  • чтобы запустить программу, замените dll dll на реальный.

Ответ 3

Вы также можете пойти динамически, используя LoadLibrary() и GetProcAddress().

(см. вторую ссылку для примера).

Ответ 4

В таких случаях, как zlib или sqlite, вы можете напрямую скачать исходный код и скомпилировать свой собственный файл lib. На самом деле, я просто сделал это на днях для zlib, я загрузил источник из www.zlib.net (direct zlib 1.2.3 download) открыл предоставленный файл проекта визуальной студии и скомпилировал как отладочную, так и выпускную версию lib. Я не пробовал sqlite, но, видя, что у них есть источники, это не сложно сделать.

Если это проприетарная dll, вы можете попробовать попросить оригинального разработчика или компанию для файла lib или написать свою собственную dll-заглушку, которая может предложить или пойти по динамическому маршруту, который RaphaelSP.

Если они экспортируются в C (не указано имя С++), я бы сам пошел по динамическому маршруту.

Ответ 6

Это - бесплатный инструмент, который делает преобразование. Я не уверен, что это "бесплатно", как в "ограниченной пробной версии" или нет, информация не очень ясна. Если вы уже проверили это, отредактируйте свой вопрос, и я удалю этот ответ.

Ответ 7

Если вы обратитесь к разработчику инструмента Dll для lib, они могут предоставить вам скидку.

Я был в этих ситуациях раньше (когда мне нужен был дорогостоящий инструмент всего один раз), и иногда у меня был успех в получении большой скидки.

Никогда не помешает попробовать.

Удачи.

Ответ 8

У меня был успех в получении lib из DLL, используя подробности в http://wyw.dcweb.cn/dllfaq.htm. Ваш пробег может отличаться. Я использовал это, чтобы получить lib из библиотеки python для создания некоторых расширений python, которые написаны на 'C'.

Ответ 9

Открытый исходный код edll имеет свой собственный внутренний загрузчик COFF. edll написан для совершенно разных целей, но поскольку он имеет независимый загрузчик COFF внутри, возможно, он может включить вашу .dll в двоичный поток или ресурс внутри вашего .exe, а затем во время выполнения использовать edll COFF-загрузчик для загрузки встроенной dll.