Dynamiczne linkowanie klas.

0

Witam,
Problem mam taki:
Stworzyłem sobie bibliotekę, która na pewno jest OK.
W tej bibliotece mam funkcję, która zwraca nowy obiekt. Wygląda ona tak:

extern "C"
{
        DLLIMPORT eSockKl* StworzESock();   //definicja
}


eSockKl* StworzESock()
{
     eSockKl* s;
     return s;
}

Ale kiedy próbuję pobrać adres tej funkcji, a robię to tak:

typedef int (__cdecl *FUN)();

FUN stw;

if(hDll != NULL)
    {
            cout << "dll zaladowany\n";
            stw = (FUN)GetProcAddress(hDll, "StworzESock");
    }
    
    if(stw != NULL)
    {
           cout << "funkcja jest\n";
           (stw)();
                    
    }
    else cout << "nie ma funkcji\n";

wyświetla "nie ma funkcji".

Starałem się wszystko robić jak w kursie na darkcult.gamedev.pl, ale u mnie wywala błąd jeśli zrobię tak:

eSockKl* CreateObject()
{
 return new eSockKl;
}
0

Witam,
Spróbuj zdefiniować funkcje tak:

extern "C" __declspec(dllexport) eSockKl* StworzESock();   //definicja

oraz ciało funkcji :

extern "C" __declspec(dllexport) eSockKl* StworzESock()
{
     eSockKl* s;  //?? chyba zapomniałeś new ?
     return s;
}

i w programie gdzie ładujesz biblioteke definicje funkcji na :

typedef eSockKl* (FUN)(void);

Powinno działać.

0
typedef eSockKl* (FUN)(void);

To nie działa.

7 ..\main.cpp expected init-declarator before '*' token 
7 ..\main.cpp expected `,' or `;' before '*' token 

Aha, jeszcze jedno, w klasie, która jest w bibliotece, konstruktor pobiera dwa argumenty (char* i int).
Spróbowałem więc zrobić coś takiego:

typedef int (__cdecl *FUN)(char*, int);

Ale to niestety nie działa.
Treść błędu:

23 ..\main.cpp invalid conversion from `int' to `int (*)(char*, int)' 
0

jak używasz Visuala, to może nie wybrałeś opcji dopisywania tablicy exportów

jak tworzysz projekt DLL, to ta masz pole "Export symbols", domyślnie jest odznaczone, a musisz je zaznaczyć, żeby móc linkować dynamicznie

bo ci nie utworzy tablicy symboli(potrzebnej dla GetProcAddress), przy łączeniu statycznym nie jest to potrzebne, dlatego jest opcja którą można wyłączyć takie generowanie tablicy

0

Używam Dev'a.

0

Zacznijmy od tego sprawdź czy dll masz dobrze utworzony, uruchom cmd przejdź do folderu z twoim dll np mojdll.dll i napisz w wierszu poleceń :
rundll32.exe mojdll.dll,StworzESock
jak nie będzie komunikatu błędu to dll jest ok.

Jeszcze jedno przy takiej deklaracji FUN jak ja podałem, nie jest ona wskaźnikiem dlatego nie pisz
FUN stw; tylko FUN* stw; przy GetProcAddr też dodaj gwiazdkę

0

Nie ma błędu.

Hmm coś chyba nie zrozumiałem,
wkleję cały kod (nie jest długi)

#include <cstdlib>
#include <windows.h>
#include <iostream>

using namespace std;
typedef int (__cdecl *FUN)(char* c, int cc);
typedef eSockKl* (FUN*)();

int main()
{
    FUN stw;
    FUN sock;
    HINSTANCE hDll = LoadLibrary("esock.dll");
    if(hDll != NULL)
    {
            cout << "zaladowana\n";
            stw = (FUN)GetProcAddress(hDll, "StworzESock");
    }
    
    if(stw != NULL)
    {
           cout << "funkcja jest\n";
           sock = (stw)("cos", 122);
           if(sock == NULL)
           cout << "zle\n";               
    }
    else cout << "nie ma funkcji\n";
    
    
    system("pause");
    
    return 1;
}
0

Namieszałeś, po co ci dwie różne definicje FUN, wybierz tę moją, zmień tylko parametry wejściowe i wyjściowe na takie jak masz aktualnie i powinno ci działać

0

Przy twojej definicji są błędy, między innymi, że nie wie co to FUN.

Zresztą to zrobię statyczne linkowanie.
Ale warto byłoby się dowiedzieć jak to się robi.

0

Już sobie poradziłem :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1