Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CommunityОтветов: 9

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

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

Добавлено1:

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

Добавлено2:

Я переписал этот код для 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 с аргументом / exports C: \ path \ to \ AddShow.dll абсолютно ничего не делает После некоторых исследований

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

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

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

Так что я безуспешно попробовал дампер двоичных файлов Microsoft (R) COFF версии 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. Локальный

C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ dumpbin.exe. Локальный

из 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 не было должным образом сохранено при вызове функции после успешного обратного вызова C # из кода C ++ библиотеки GameSpy, это связано с тем, что я использовал 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, все стало хорошо.

  • Это собственная библиотека C / C ++ или .NET? Timo Geusch 08.10.2009
  • Подождите ... Не было бы проще, по крайней мере, в случае zlib и sqlite3, получить исходные библиотеки импорта? Raphaël Saint-Pierre 09.10.2009
  • sqlite - это просто пример, о котором все слышали. Я знаю, что для этого существуют исходные библиотеки inport, но dll, которую я пытаюсь преобразовать (AddTwoNum.dll), нет. Mike Trader 09.10.2009
  • Я думаю, вам следует задать новый вопрос по поводу вашего обновления. Ему может быть полезно новое название и новый набор ответчиков. Raphaël Saint-Pierre 14.10.2009

windowsc++dllimportvisual-c++

Ответы

Ответ 1 · рейтинг 6 · floodyberry

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

Ответ 2 · рейтинг 5 · iain

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

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

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

Ответ 3 · рейтинг 4 · Raphaël Saint-Pierre

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

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

Ответ 4 · рейтинг 1 · Joshua

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

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

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

Ответ 5 · рейтинг 1 · Community

Я довольно быстро нашел этот пример: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

Ответ 6 · unwind

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

Ответ 7 · TWA

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

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

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

Удачи.

Ответ 8 · Community

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

Ответ 9 · Community

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы