forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Взаимодействие С++ и DLL (http://forum.boolean.name/showthread.php?t=8152)

Aceton 05.04.2009 22:54

Взаимодействие С++ и DLL
 
Кто подключал к проекту на С++ DLLки поделитесь опытом как вызывать функции из длл, а так же возможно ли вскрыть Длл и добавить в свой проект функции из нее если , дллка написана на С++

HolyDel 05.04.2009 23:05

Ответ: Взаимодействие С++ и DLL
 
проще пареной репы:

Код:

HINSTANCE mydll = LoadLibriary("mylib.dll");
if(mydll==0)
  ShowError("Кривая библиотека!");

myfunc = (PFNMYFUNCPROC)GetProcAddress(mydll,"MyFuncStringName");


HolyDel 05.04.2009 23:35

Ответ: Взаимодействие С++ и DLL
 
кстати, это динамическая линковка. еще можно подрубать библиотеку статически (если есть .lib файл).
например через прагму коммент -
#pragma comment (lib,"mylib.lib")
тогда не нужно каждую функцию получать вручную.

h1dd3n 06.04.2009 02:07

Ответ: Взаимодействие С++ и DLL
 
При подключении статик-либы ведь не надо будет редист ставить на каждый комп? А длл таскать с собой?

HolyDel 06.04.2009 02:12

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

в чем плюсы статического подключения я не знаю (кроме того, что не надо каждую функцию вручную инитить)
плюсы динамического подключения в том - что если не нужна какая то редкая функция из библиотеки, то и библиотеку можно не загружать). Кроме того можно будет как то обработать ситуацию если длл-ки нет. В случае статической линковки - приложение гарантированно упадет.

ABTOMAT 06.04.2009 02:31

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

HolyDel 06.04.2009 02:44

Ответ: Взаимодействие С++ и 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");
}


-=Jack=- 06.04.2009 09:27

Ответ: Взаимодействие С++ и DLL
 
>lib файл генерируется при разработке static библиотек.
Его ещё можно сгенерировать из def-файла утилитой lib.exe из Visual Studio, а def-файл, в свою очередь, можно сгенерировать утилитой impdef.exe из GodeGear Rad Studio/C++ Builder/TASM.

>в чем плюсы статического подключения я не знаю (кроме того, что не надо каждую функцию вручную инитить)
А больше ничего и нет, после загрузки любая дллочная функция ничем не отличается от тех, которые написаны в самой программе.
>возможно ли вскрыть Длл и добавить в свой проект функции из нее если , дллка написана на С++
нет

jimon 06.04.2009 10:51

Ответ: Взаимодействие С++ и 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 будет только одна в памяти программы потому что она раньше уже была загружена


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot