Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pytanie odnośnie bibliotek DLL

Ostatnio zmodyfikowano 2015-09-17 16:19
Autor Wiadomość
elradziu
Temat założony przez niniejszego użytkownika
Pytanie odnośnie bibliotek DLL
» 2015-09-10 18:04:38
Mam takie pytanie mając pewną bibliotekę DLL która zawiera funkcje np. SUMA czy można tą bibliotekę dodać do innej biblioteki DLL? W skrócie mówiąc chcę by jedna biblioteka DLL korzystała z innej. Na razie robię to w ten sposób że tworze bibliotekę z funkcją SUMA. Potem tworzę drugą bibliotekę z inną funkcją która odwołuje się do tej pierwszej. Robię to tak samo jak bym statycznie linkował bibliotekę w aplikacji exe. Tylko że wywala mi błąd że funkcja SUMA jest nie zdeklarowana w tym projekcie. Oto kod:

Plik main2.cpp:
C/C++
#include "main2.h"
#include "main.h"

// a sample exported function
void DLL_EXPORT SomeFunction( const LPCSTR sometext )
{
    MessageBoxA( 0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION );
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH:
        // attach to process
        // return FALSE to fail DLL load
        break;
       
    case DLL_PROCESS_DETACH:
        // detach from process
        break;
       
    case DLL_THREAD_ATTACH:
        // attach to thread
        break;
       
    case DLL_THREAD_DETACH:
        // detach from thread
        break;
    }
    return TRUE; // succesful
}
int funkcja( int a )
{
    return Suma( a, a );
}
Plik main2.h:
C/C++
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
*  in your project.
*/

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
    #endif
   
    void DLL_EXPORT SomeFunction( const LPCSTR sometext );
    int DLL_EXPORT funkcja( int a );
    #ifdef __cplusplus
}
#endif

#endif // __MAIN_H__
P-137404
DejaVu
» 2015-09-10 20:01:59
Da się, ale najpierw proponuję abyś spróbował dobrze zrozumieć zagadnienie zależności Twoja aplikacja korzystająca z Twojej dll-ki. Z kodu, który wkleiłeś wynika, że nie rozumiesz jak to działa i sklejasz bezmyślnie fragmenty z różnych tutoriali.
P-137406
elradziu
Temat założony przez niniejszego użytkownika
» 2015-09-11 19:14:26
Ok wiem że da się to zrobić przy linkowaniu dynamicznym. Zrobiłem tak i działa. Ale pytanie czy przy linkowaniu statycznym jest taka możliwość jeżeli tak to jak to wykonać? Linkowanie statyczne w przypadku dużych bibliotek ma ten plus że kompilator na podstawie pliku nagłówkowego z biblioteki daje podpowiedzi, czyli nie trzeba pamiętać ile i jakich typów zmiennych dana funkcja używa. Ponad to jeżeli jakaś biblioteka posiada dużo funkcji, a my chcemy z nich korzystać dynamicznie to wtedy trzeba do każdej  tworzyć wskaźnik. Co jest raczej mało wygodne.
Więc może jakaś podpowiedź DejaVu?
P-137424
DejaVu
» 2015-09-13 00:00:04
Sposób linkowania kodu nie ma wpływu na intellisense. Po prostu trzeba kod pisać poprawnie. Najlepszym przykładem, że się da jest SFML. Biblioteka do dźwięku SFML-a jest dll-ką, która jest zależna od innej DLL-ki (openAL), a aplikacja korzysta z bibliotek SFML-owych i nigdzie nie określa się dodatkowych zależności, choć one istnieją.
P-137464
elradziu
Temat założony przez niniejszego użytkownika
» 2015-09-17 08:48:18
Szczerze powiem że nie bardzo wiem gdzie popełniam bład, bo jedyna różnica między poprzednim wykorzystywaniem dll a aktualną jest taka że wcześniej biblioteka dll (z własnymi funkcjami) została wykorzystywana w kodzie źródłowym pliku *exe. A teraz chcę tą samą bibliotekę wykorzystać przez inną. Czynności wykonuję te same i naprawdę nie mogę dojść do tego jaka ma być różnica w kodzie gdy bibliotekę chcę wykorzystać przez inną DLL. Jedyne co mi się nasuwa na myśl że może być błąd w bibliotece tej pierwszej. A dla tego że jak pisałem wcześniej jakąś bibliotekę dll, to wykorzystywałem biblioteki np. CURL I też było wykorzystywane linkowanie statyczne. A jakoś problemów z kompilacją nie było. Więc szczerze już nie wiem. A wspomniałeś że sposób linkowania nie ma znaczenia.
P-137581
pekfos
» 2015-09-17 10:37:00
Tylko że wywala mi błąd że funkcja SUMA jest nie zdeklarowana w tym projekcie.
Może by tak w tym kierunku..? Pokaż plik z deklaracją tej funkcji, jeśli uważasz, że ją masz.
P-137583
elradziu
Temat założony przez niniejszego użytkownika
» 2015-09-17 13:36:12
Deklaracja funkcji znajduje się w pliku main.h (podczas tworzenia bliblioteki test1.dll)

main.h:
C/C++
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
*  in your project.
*/

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
    #endif
   
    void DLL_EXPORT SomeFunction( const LPCSTR sometext );
    int DLL_EXPORT Suma( int a, int b );
   
    #ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

Gdy wykorzystuję tą bibliotekę test1.dll bezpośrednio w programie *exe. To problemów nie ma, linkuję statycznie całą bibliotekę przez:
Dodanie do linkiera pliku libtest1.a
dodanie po przez #include "main.h" (tak jak w pierwszym poście), ponad to plik main.h jest skopiowany do katalogu projektu test2. czyli mojej drugiej biblioteki dll.
P-137591
pekfos
» 2015-09-17 14:23:09
Plik main2.h:
C/C++
#ifndef __MAIN_H__
#define __MAIN_H__
Zmień na __MAIN2_H__.
P-137592
« 1 » 2
  Strona 1 z 2 Następna strona