MinGW работа с dll (Windows)
От: Аноним  
Дата: 27.11.06 06:11
Оценка:
Здравствуйте!

Хочу подключать и использовать dll в своей программе ( компилированной GCC (MinGW), dll создавал этим же компилятором (-shared) ).
Проччитал про функции MinGW для этого дела ( dlopen,dlsym,dlclose ), но чтобы их использовать нужно подключить dlfcn.h, которого я не нашел в установленной MinGW ( на платформе Windows ).

Подскажите, пожалуйста, ответ на этот вопрос.


Заранее спасибо!
Re: MinGW работа с dll (Windows)
От: Tonal- Россия www.promsoft.ru
Дата: 27.11.06 08:05
Оценка:
Тебе нужно именно динамически dll-ку грузить, или статически подойдёт?
Если статически подойдёт, то просто добавь в строку сборки -LПуть_к_библиотеке_импорта -lимя_dll_ки_без_расширения.
Re[2]: MinGW работа с dll (Windows)
От: Аноним  
Дата: 27.11.06 08:09
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Тебе нужно именно динамически dll-ку грузить, или статически подойдёт?

T>Если статически подойдёт, то просто добавь в строку сборки -LПуть_к_библиотеке_импорта -lимя_dll_ки_без_расширения.


Интересует динамическое подключение библиотеки.
Re[3]: MinGW работа с dll (Windows)
От: Сергей  
Дата: 27.11.06 08:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Tonal-, Вы писали:


T>>Тебе нужно именно динамически dll-ку грузить, или статически подойдёт?

T>>Если статически подойдёт, то просто добавь в строку сборки -LПуть_к_библиотеке_импорта -lимя_dll_ки_без_расширения.


А>Интересует динамическое подключение библиотеки.


Используй LoadLibrary/GetProcAddress. Если хочется портабельности, то можно написать как-то так:
#ifdef WINDOWS
#define dlopen LoadLibrary
#define dlsym GetProcAddress
#endif


т.к. сигнатуры LoadLibrary/GetProcAddress и dlopen/dlsym похожи
Re[4]: MinGW работа с dll (Windows)
От: Аноним  
Дата: 27.11.06 09:53
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Tonal-, Вы писали:


T>>>Тебе нужно именно динамически dll-ку грузить, или статически подойдёт?

T>>>Если статически подойдёт, то просто добавь в строку сборки -LПуть_к_библиотеке_импорта -lимя_dll_ки_без_расширения.


А>>Интересует динамическое подключение библиотеки.


С>Используй LoadLibrary/GetProcAddress. Если хочется портабельности, то можно написать как-то так:

С>
С>#ifdef WINDOWS
С>#define dlopen LoadLibrary
С>#define dlsym GetProcAddress
С>#endif
С>


С>т.к. сигнатуры LoadLibrary/GetProcAddress и dlopen/dlsym похожи



Попробовал использовать WinAPI. Библиотеку загружает нормально. а вот функцию не находит.
GetProcAddress( handle, "test" ) возвращает NULL.

Компиляция библиотеки
g++ test.cpp -shared -o test.dll

Компиляуия exe
g++ main.cpp -o main.exe


------.H для dll и exe

#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

EXPORT void hello(void);


-------- .cpp для DLL


#define BUILD_DLL

#include "./test.h"
#include <stdio.h>

EXPORT void hello(void) {
printf ("Hello\n");
}


----------- .cpp для EXE

#include "./test.h"
#include <stdio.h>


HMODULE lib = ::LoadLibraryW( L"test.dll" );

if ( lib <= ((void*)HINSTANCE_ERROR) ){
printf( "error %d (%d)\n", GetLastError(), lib );
::Sleep( 10000 );
return 0;
}

typedef void (*pfunc)();

pfunc hello;

hello = (pfunc)GetProcAddress(lib, "hello");

if ( hello != NULL )
hello();
else
printf( "hello is null (%d)\n", GetLastError() );

::Sleep( 10000 );
Re[5]: MinGW работа с dll (Windows)
От: green.nsk  
Дата: 27.11.06 10:10
Оценка: +1
On Mon, 27 Nov 2006 15:53:18 +0600, Аноним <0@users.rsdn.ru> wrote:

> extern "C" EXPORT void hello(void) {

> printf ("Hello\n");
> }
вроде так принято писать.
читать, что такое декорация (или декорирование) имён в c++. Думаю, по
этому поводу написано уже много.

ну и для интереса можно посмотреть dumpbin /exports your.dll в обоих
вариантах
Posted via RSDN NNTP Server 2.0
Re[6]: MinGW работа с dll (Windows)
От: Аноним  
Дата: 27.11.06 10:40
Оценка:
Здравствуйте, green.nsk, Вы писали:

GN>On Mon, 27 Nov 2006 15:53:18 +0600, Аноним <0@users.rsdn.ru> wrote:


>> extern "C" EXPORT void hello(void) {

>> printf ("Hello\n");
>> }
GN>вроде так принято писать.
GN>читать, что такое декорация (или декорирование) имён в c++. Думаю, по
GN>этому поводу написано уже много.

GN>ну и для интереса можно посмотреть dumpbin /exports your.dll в обоих

GN>вариантах

Спасибо, получилось!!!

Скажите, а как экспортировать классы?
Re[7]: MinGW работа с dll (Windows)
От: Ulfur Россия  
Дата: 27.11.06 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, green.nsk, Вы писали:


GN>>On Mon, 27 Nov 2006 15:53:18 +0600, Аноним <0@users.rsdn.ru> wrote:


>>> extern "C" EXPORT void hello(void) {

>>> printf ("Hello\n");
>>> }
GN>>вроде так принято писать.
GN>>читать, что такое декорация (или декорирование) имён в c++. Думаю, по
GN>>этому поводу написано уже много.

GN>>ну и для интереса можно посмотреть dumpbin /exports your.dll в обоих

GN>>вариантах

А>Спасибо, получилось!!!


А>Скажите, а как экспортировать классы?


Это будет компиляторозависимо (т.е. эту dll можно будет использовать только с программами написанными тем же компилятором). Посмотри как это сделано для COM — 4 функции — можно упростив повторить этот подход (интерфейсы + С-шный интерфейс экспортируемых из dll функций), сделав его переносимым. В своей практике только так и делаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.