• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

odczytywanie funkcji z własnej biblioteki Dll c++

Object Storage Arubacloud
0 głosów
1,024 wizyt
pytanie zadane 17 kwietnia 2017 w C i C++ przez Kurogami12 Bywalec (2,610 p.)

Ostatnio zabrałem się za tworzenie bibliotek dll, niestety nie znalazłem niesamowicie dobrych źródeł do ich nauki w internecie (przy okazji jeśli ktoś ma to miło by było jakby podał). Natrafiłem na taki problem którego szczególnie nie rozumiem. Biblioteka jest stworzona ale działa tylko w połowie, to znaczy działają mi na niej tylko funkcje typu int, zmienne nie są ładowane wcale. to jest moja biblioteka:

plik .cpp:

#define Dll_EXPORTS
#include "Dll.h"
#include <iostream>
#include <stdexcept>

using namespace std;

int Add(int a, int b)
    {
     cout<<"Funkcja Add dziala poprawnie"<<endl;
        return a+b;
    }
void test()
{
     cout<<"Funkcja Test działa poprawnie";
 }

plik .h:

#ifndef _DLL_H_
#define _DLL_H_

#include <iostream>

#ifdef Dll_EXPORTS
#define DllAPP __declspec(dllexport) 
#else
#define DllAPP __declspec(dllimport) 
#endif

    extern "C"
    {
         int DllAPP Add(int a, int b); 
         int x=5;
         void test();
    }

#endif /* _DLL_H_ */

i fragment aplikacji która korzysta z biblioteki:

    typedef int (*Funkcja)(int, int);
    typedef void (*Testowa)();
    int X;
    Testowa testowa;
    Funkcja funkcja;
    HINSTANCE hInstLib = LoadLibrary("Lib/Library.dll");
    if(hInstLib!=NULL)
    {
         X = (int )GetProcAddress(hInstLib,"x");
         if(X!=0)    cout<<X<<endl;         //tutaj nie znajduje zmiennej
         else cout<<"Zmienna x nie istnieje"<<endl;

         funkcja = (Funkcja)GetProcAddress(hInstLib,"Add");
         if(funkcja!=NULL)     cout<<funkcja(2,2)<<endl;
         else cout<<"funkcja Add nie dziala!"<<endl;

         testowa = (Testowa)GetProcAddress(hInstLib,"test");
         if(testowa!=NULL)         testowa();           //tutaj nie znajduje funkcji
         else {
              
              cout<<"funkcja test nie dziala!";
              }
              
         FreeLibrary(hInstLib);
    }      else    cout<<"Nie zaladowano biblioteki!";

Z tego co wyczytałem w internecie to powinno to w zupełności wystarczyć żeby wszystko działało odpowiednio.

1 odpowiedź

+2 głosów
odpowiedź 17 kwietnia 2017 przez j23 Mędrzec (194,920 p.)
wybrane 17 kwietnia 2017 przez Kurogami12
 
Najlepsza

 int x=5;

Jeśli to ma być zmienna globalna, to:

// w pliku .cpp
int x = 5; 

// w pliku .h
extern DllAPP int x; 

 

void test();

Dlaczego tak, a nie void DllAPP test();?

 

W przypadku eksportowania funkcji warto jawnie zdefiniować konwencję wywołania - na ogół jest to __stdcall (choć VC może dodawać _ przed nazwą).

komentarz 17 kwietnia 2017 przez Kurogami12 Bywalec (2,610 p.)
właśnie chodziło o to "DllAPP" dziękuje za pomoc, co do zmiennej globalnej to faktycznie tam też jest źle, również dziękuje za pomoc z tym :)

Podobne pytania

0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 28 lutego 2021 w C# przez Szabranigdo Obywatel (1,370 p.)
0 głosów
1 odpowiedź 532 wizyt
0 głosów
2 odpowiedzi 546 wizyt
pytanie zadane 10 października 2015 w C i C++ przez hit02 Nałogowiec (33,970 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...