Я знаю, что есть инструмент под названием 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, все было хорошо.
Является ли это родной C/C++ DLL или .NET? –
Подождите минуту ... Не проще ли, по крайней мере, в случае zlib и sqlite3 получить исходные библиотеки импорта? –
sqlite - это всего лишь пример, о котором все слышали. Я знаю, что для этого существуют оригинальные библиотеки inport, но dll, который я пытаюсь выполнить convet (AddTwoNum.dll), нет. –