|
05.04.2009, 22:54
|
#1
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Взаимодействие С++ и DLL
Кто подключал к проекту на С++ DLLки поделитесь опытом как вызывать функции из длл, а так же возможно ли вскрыть Длл и добавить в свой проект функции из нее если , дллка написана на С++
|
(Offline)
|
|
05.04.2009, 23:05
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Взаимодействие С++ и DLL
проще пареной репы:
HINSTANCE mydll = LoadLibriary("mylib.dll");
if(mydll==0)
ShowError("Кривая библиотека!");
myfunc = (PFNMYFUNCPROC)GetProcAddress(mydll,"MyFuncStringName");
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
05.04.2009, 23:35
|
#3
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Взаимодействие С++ и DLL
кстати, это динамическая линковка. еще можно подрубать библиотеку статически (если есть .lib файл).
например через прагму коммент -
#pragma comment (lib,"mylib.lib")
тогда не нужно каждую функцию получать вручную.
|
(Offline)
|
|
06.04.2009, 02:07
|
#4
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Взаимодействие С++ и DLL
При подключении статик-либы ведь не надо будет редист ставить на каждый комп? А длл таскать с собой?
|
(Offline)
|
|
06.04.2009, 02:12
|
#5
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Взаимодействие С++ и DLL
а при чем здесь редисты? надо будет и их ставить (или ставьте /MT) и длл-ку с собой таскать.
в чем плюсы статического подключения я не знаю (кроме того, что не надо каждую функцию вручную инитить)
плюсы динамического подключения в том - что если не нужна какая то редкая функция из библиотеки, то и библиотеку можно не загружать). Кроме того можно будет как то обработать ситуацию если длл-ки нет. В случае статической линковки - приложение гарантированно упадет.
|
(Offline)
|
|
06.04.2009, 02:31
|
#6
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Взаимодействие С++ и DLL
А где взять lib- или а-файл? И что он вообще из себя представляет? Можно ли его сделать, если я знаю названия функций и их аргументы? Короче, из decls'а?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
06.04.2009, 02:44
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Взаимодействие С++ и DLL
lib файл генерируется при разработке static библиотек.
из decls - а ты сможешь сгенерировать h и cpp файлы примерно такого вида:
.h
typedef (void)(*func1)(int,int) PFNFUNC1
typedef (int)(*func2)(void) PFNFUNC2
typedef (float)(*func3)(int,int,float) PFNFUNC3
PFNFUNC1 func1 = 0;
PFNFUNC2 func2 = 0;
PFNFUNC3 func3 = 0;
.cpp
void InitLib1()
{
HINSTANCE dll = LoadLibriary("mydll1.dll");
func1 = (PFNFUNC1)GetProcAddress(dll,"func1");
func2 = (PFNFUNC2)GetProcAddress(dll,"func2");
func3 = (PFNFUNC3)GetProcAddress(dll,"func3");
}
Последний раз редактировалось HolyDel, 06.04.2009 в 02:53.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.04.2009, 09:27
|
#8
|
ПроЭктировщик
Регистрация: 10.01.2009
Адрес: хз
Сообщений: 177
Написано 18 полезных сообщений (для 44 пользователей)
|
Ответ: Взаимодействие С++ и DLL
>lib файл генерируется при разработке static библиотек.
Его ещё можно сгенерировать из def-файла утилитой lib.exe из Visual Studio, а def-файл, в свою очередь, можно сгенерировать утилитой impdef.exe из GodeGear Rad Studio/C++ Builder/TASM.
>в чем плюсы статического подключения я не знаю (кроме того, что не надо каждую функцию вручную инитить)
А больше ничего и нет, после загрузки любая дллочная функция ничем не отличается от тех, которые написаны в самой программе.
>возможно ли вскрыть Длл и добавить в свой проект функции из нее если , дллка написана на С++
нет
__________________
Я бы изменил мир, но Бог не даёт исходников...
|
(Offline)
|
|
06.04.2009, 10:51
|
#9
|
|
Ответ: Взаимодействие С++ и DLL
HolyDel
добавлю про редисты :
сам язык C++ не имеет никаких реализаций контейнеров, функций или чего либо еще, потому нужен код который реализует так сказать "runtime" (в аналогии терминов с blitz3d)
в большинстве случаев ваша программа просто использует код из C Runtime Library (CRT)
даже если у нас есть исходники CRT (микрософт их всё же дает), то они всё равно лежат в скомпилированом виде по нескольким причинам :
1) время компиляции проекта
2) если CRT код одинаков для всех программ которые написаны на этой студии то зачем его таскать с каждой программой ?
именно пункт 2 решает проблему большого минимального exe (другие языки очень любят меряцо - "а у нас минимальный exe в 5 кб ахахаха")
в настройках проекта можно насильно указать что делать - прилинковать статически или использовать системную
но тут еще есть одна очень БОЛЬШАЯ СЛОЖНАЯ особенность
расмотрим пример :
у нас есть program.exe, plugin.dll (plugin.dll линкуется динамически)
program.exe выделяет 100 байт памяти и передает указатель plugin.dll, plugin.dll ети 100 байт удаляет, программа падает, романтика
это происходит когда в program.exe и plugin.dll свои функции для выделения и удаления памяти, тоесть CRT прилинкован к каждой статически
чтобы это исправить используют линковку CRT в виде DLL, тогда получается что в памяти програмы CRT только одно сидит и функции выделения и удаления памяти общие на програму и плагин
(описаная проблема не появляется когда plugin.dll линкуется статически, разве что перемудрить и выкинуть из .lib файла информацию о прилинкованых других либах)
по-этому надо все проекты которые использует ваша програма компилировать или в /MT или в /MD, если одна либа скомпилирована в /MT, а другая в /MD то ваша программа будет играть в романтического котика ходящего по-мосту : упадёт, не упадёт, упадёт ...
ps. Пролетарий ! используй /MT или компилируй конечный продукт в mingw (разработка на msvc, а компиляция конечного продукта на mingw)
ps2. проблему с плагинами еще решают так - делают core.dll в которым определены свои функции выделения и удаления памяти, ваша программа выделяет память с помощью кода из core.dll, а plugin.dll удаляет память тоже с помощью кода из core.dll, при этом при загрузке плагина core.dll будет только одна в памяти программы потому что она раньше уже была загружена
|
|
|
Эти 3 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:39.
|