Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 05.04.2009, 22:54   #1
Aceton
ПроЭктировщик
 
Аватар для Aceton
 
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений
(для 24 пользователей)
Взаимодействие С++ и DLL

Кто подключал к проекту на С++ DLLки поделитесь опытом как вызывать функции из длл, а так же возможно ли вскрыть Длл и добавить в свой проект функции из нее если , дллка написана на С++
__________________
Все о создании и разработке игр и не только
(Offline)
 
Ответить с цитированием
Старый 05.04.2009, 23:05   #2
HolyDel
 
Регистрация: 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 за это полезное сообщение:
ABTOMAT (06.04.2009), Aceton (05.04.2009), h1dd3n (06.04.2009), newman (06.04.2009)
Старый 05.04.2009, 23:35   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Взаимодействие С++ и DLL

кстати, это динамическая линковка. еще можно подрубать библиотеку статически (если есть .lib файл).
например через прагму коммент -
#pragma comment (lib,"mylib.lib")
тогда не нужно каждую функцию получать вручную.
(Offline)
 
Ответить с цитированием
Старый 06.04.2009, 02:07   #4
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Взаимодействие С++ и DLL

При подключении статик-либы ведь не надо будет редист ставить на каждый комп? А длл таскать с собой?
(Offline)
 
Ответить с цитированием
Старый 06.04.2009, 02:12   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Взаимодействие С++ и DLL

а при чем здесь редисты? надо будет и их ставить (или ставьте /MT) и длл-ку с собой таскать.

в чем плюсы статического подключения я не знаю (кроме того, что не надо каждую функцию вручную инитить)
плюсы динамического подключения в том - что если не нужна какая то редкая функция из библиотеки, то и библиотеку можно не загружать). Кроме того можно будет как то обработать ситуацию если длл-ки нет. В случае статической линковки - приложение гарантированно упадет.
(Offline)
 
Ответить с цитированием
Старый 06.04.2009, 02:31   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Взаимодействие С++ и DLL

А где взять lib- или а-файл? И что он вообще из себя представляет? Можно ли его сделать, если я знаю названия функций и их аргументы? Короче, из decls'а?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 06.04.2009, 02:44   #7
HolyDel
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
newman (06.04.2009)
Старый 06.04.2009, 09:27   #8
-=Jack=-
ПроЭктировщик
 
Аватар для -=Jack=-
 
Регистрация: 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
jimon
 
Сообщений: n/a
Ответ: Взаимодействие С++ и 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 пользователя(ей) сказали Спасибо за это полезное сообщение:
h1dd3n (06.04.2009), HolyDel (06.04.2009), impersonalis (06.04.2009)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com