Я знаю, что есть инструмент под названием 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, все было хорошо.