2009-10-08 3 views
12

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

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

Added1:

DLL файлы обычно STDCALL не Cdecl и написано в старых C, как языки НЕ C# или .NET или C++. Теперь мне нужно вызвать их из приложений на C++. Примером может служить файл SQLite.dll или zlib.dll. У меня нет доступа к файлам .lib для этих dll.

Added2:

я переписал этот код для VS2008 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/ и включал в себя пример Dll и т.д. загружаемое здесь: 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: \ путь \ к \ AddShow.dll делает Absolutly ничего После некоторых исследований

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

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

У меня есть Microsoft (R) COFF/PE Dumper Версия 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 пытается открыть его и не с ошибка ПУТЬ НЕ НАЙДЕНО. путь - C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ SQLITE3.DLL и является правильным. Если бы я положил его в корень диска C, то я получаю имя не Обнаружены ошибки:

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

C: \ Программные файлы \ 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 и компилируются и запускаются. Отладчик затем сообщил об ошибке: Run-Time Check Failure # 0 - значение ESP не была должным образом сохранен в вызове функции ...

Как уже упоминалось здесь "Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call" after successful C# callback from the C++ code of 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

Это декорированный имя функции по какой-то причине. Зачем?

Добавлено п:

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

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

+0

Является ли это родной C/C++ DLL или .NET? –

+0

Подождите минуту ... Не проще ли, по крайней мере, в случае zlib и sqlite3 получить исходные библиотеки импорта? –

+0

sqlite - это всего лишь пример, о котором все слышали. Я знаю, что для этого существуют оригинальные библиотеки inport, но dll, который я пытаюсь выполнить convet (AddTwoNum.dll), нет. –

ответ

0

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

+0

это инструмент за $ 999 (теперь в версии 3.0, но спасибо в любом случае). –

+0

Ну, вы были правы. Я предложил ему 100 долларов, и он согласился. Я предпочитаю иметь собственное решение. –

+0

@Mike Trader - Разве вы не имеете в виду Я был прав насчет того, чтобы просить скидку? :) –

5

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

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

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

вы считаете правильным. У меня обычно есть заголовочный файл .h, поэтому я знаю подписи. Шаги, которые вы детализируете, новы для меня. Если бы вы могли подробно описать их или связать с демонстрацией, я был бы очень благодарен. –

+1

В принципе, это сводится к созданию нового проекта DLL, который будет генерировать тот же самый импортный lib, что и тот, который вам не хватает. –

+0

Справа. Его просто случай навигации по сложным водам, чтобы добраться туда –

4

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

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

+0

Спасибо. Да, это всегда хороший способ. Это будет работать, но цель этого вопроса состоит в том, чтобы включить библиотеку в проект VS2008 без использования $ 1000 –

0

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

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

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

Удачи.

+0

Вы правы. Я сделал. Он принял 100 долларов за продукт, но после этого много работы я собираюсь сворачивать сам. –

1

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

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

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

+0

Да. Я хочу конвертировать Dll, НЕ имеют .def или .lib-файлы ТОЛЬКО заголовок. –

6

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

+0

У вас есть почта –

+0

Благодарим вас за этот код. Я попадаю на финишную прямую. см. выше –

+0

Я нашел: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/b307bf26-2441-438f-960d-6b54db83fd6d Вы связываетесь с .dll вместо .lib? – floodyberry

0

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

0

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

Смежные вопросы