Я пытаюсь создать приложение в visual studio, которое сможет получить доступ к DLL файлу, который уже существует. Мне нужно приложение для вызова подпрограмм. У меня также есть файл заголовка, который уже существует.
Я изучаю в Интернете и обнаружил, что мне нужно создать .lib файл. Если посмотреть на подобные вопросы, здесь я нашел ссылку: http://support.microsoft.com/kb/131313 Однако я не могу следовать указаниям.
Информация в ссылке говорит о создании файла DEF (я читал в другом месте, что это нужно скомпилировать как DLL с тем же именем, но не уверен, что это имя, с тем же именем, что и DLL файл?), Но я не понимаю первого направления: "Использовать DUMPBIN/EXPORTS". Затем мне нужно "заглушить" функции, а затем что-то делать с файлами .OBJ(я не знаю, что это за файлы).
Есть ли пошаговые инструкции, похожие на приведенные выше ссылки, которые легко отслеживать?
Вам понадобится Microsoft Visual С++ 2010 Express (или любой другой источник средств командной строки MSVC) и ваша DLL.
Шаги:
dumpbin /EXPORTS yourfile.dll > yourfile.exports
yourfile.exports
в новый yourfile.def
файл. Добавьте строку со словом EXPORTS
вверху этого файла.VC\bin
(тот, где lib.exe
и другие инструменты компиляции).
vcvars32.bat
lib /def:yourfile.def /out:yourfile.lib
Вы должны создать два файла: yourfile.lib
и yourfile.exp
dumpbin.exe /EXPORTS yourfile.dll
для шагов 1 и 2 вместо Dependency Walker работает так же хорошо для получения экспортированных имен функций.
Вы можете использовать инструмент Digital Mars IMPLIB. Он может создать файл lib, используя только DLL, без необходимости в файле .def.
Ссылка для скачивания http://ftp.digitalmars.com/bup.zip.
Командная строка:
implib.exe /s mydll.lib mydll.dll
Вместо создания .def вы можете создать .lib файл из DLL файла, экспортировав функции/классы, определенные в файле .dll, __declspec (dllexport), которые были указаны в коде приложения.
Например (псевдо-код)
ПРОЕКТ для создания файла X.dll(скажем, X - имя dll):
// Function declaration
__declspec(dllexport) void foo(void);
// Function definition
#include <A.h>
void foo(void) {
; // definition
}
Если вы создадите вышеупомянутый проект dll в Visual Studio, тогда компилятор будет генерировать X.dll, а также X.lib [который экспортировал функцию foo по __declspec (dllexport)].
// Load time dynamic linking:
// Application should include X.lib (not X.dll) in the project setting
#include <A.h>
int main() {
foo();
return 0;
}
Для дальнейшего изучения, пожалуйста, обратитесь к следующим ссылкам для лучшего понимания:
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL#CppMatureApproach
http://msdn.microsoft.com/en-us/library/ms686923(v=vs.85).aspx