Преобразование Windows DLL в .lib для C ++ Visual Studio 2008 - PullRequest
12 голосов
/ 08 октября 2009

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

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

Added1: * +1005 *

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

Added2: * +1009 *

Я переписал этот код для 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/

Запуск дампбина с аргументом / export 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 версии 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.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 не было должным образом сохранено при вызове функции» после успешного обратного вызова C # из кода C ++ 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-байтовых iinteger на 12 байт.

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

Ответы [ 9 ]

6 голосов
/ 09 октября 2009

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

5 голосов
/ 08 октября 2009

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

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

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

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

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

1 голос
/ 09 октября 2009

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

1 голос
/ 09 октября 2009

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

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

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

0 голосов
/ 06 января 2013

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

0 голосов
/ 14 октября 2009

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

0 голосов
/ 08 октября 2009

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

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

Попробовать никогда не повредит.

Удачи.

0 голосов
/ 08 октября 2009

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

...