Ответ 1
Я не могу прокомментировать его ответ (мне нужна больше репутации?), но вы можете попробовать использовать мой . dll wrapper generator для создания заглушки .dll iain.
Я знаю, что есть инструмент под названием 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, все было хорошо.
Я не могу прокомментировать его ответ (мне нужна больше репутации?), но вы можете попробовать использовать мой . dll wrapper generator для создания заглушки .dll iain.
Я предполагаю, что вы хотите вызвать некоторые функции/методы в dll в C/С++, не имея доступа к файлу lib для связи с ним.
Если вам известны подписи необходимых вам функций, вы можете:
Вы также можете пойти динамически, используя LoadLibrary() и GetProcAddress().
(см. вторую ссылку для примера).
В таких случаях, как zlib или sqlite, вы можете напрямую скачать исходный код и скомпилировать свой собственный файл lib. На самом деле, я просто сделал это на днях для zlib, я загрузил источник из www.zlib.net (direct zlib 1.2.3 download) открыл предоставленный файл проекта визуальной студии и скомпилировал как отладочную, так и выпускную версию lib. Я не пробовал sqlite, но, видя, что у них есть источники, это не сложно сделать.
Если это проприетарная dll, вы можете попробовать попросить оригинального разработчика или компанию для файла lib или написать свою собственную dll-заглушку, которая может предложить или пойти по динамическому маршруту, который RaphaelSP.
Если они экспортируются в C (не указано имя С++), я бы сам пошел по динамическому маршруту.
Я нашел этот пример довольно быстро: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
Это - бесплатный инструмент, который делает преобразование. Я не уверен, что это "бесплатно", как в "ограниченной пробной версии" или нет, информация не очень ясна. Если вы уже проверили это, отредактируйте свой вопрос, и я удалю этот ответ.
Если вы обратитесь к разработчику инструмента Dll для lib, они могут предоставить вам скидку.
Я был в этих ситуациях раньше (когда мне нужен был дорогостоящий инструмент всего один раз), и иногда у меня был успех в получении большой скидки.
Никогда не помешает попробовать.
Удачи.
У меня был успех в получении lib из DLL, используя подробности в http://wyw.dcweb.cn/dllfaq.htm. Ваш пробег может отличаться. Я использовал это, чтобы получить lib из библиотеки python для создания некоторых расширений python, которые написаны на 'C'.
Открытый исходный код edll имеет свой собственный внутренний загрузчик COFF. edll написан для совершенно разных целей, но поскольку он имеет независимый загрузчик COFF внутри, возможно, он может включить вашу .dll в двоичный поток или ресурс внутри вашего .exe, а затем во время выполнения использовать edll COFF-загрузчик для загрузки встроенной dll.