• 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++

VPS Starter Arubacloud
0 głosów
968 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ź 288 wizyt
pytanie zadane 28 lutego 2021 w C# przez Szabranigdo Obywatel (1,370 p.)
0 głosów
1 odpowiedź 529 wizyt
0 głosów
2 odpowiedzi 535 wizyt
pytanie zadane 10 października 2015 w C i C++ przez hit02 Nałogowiec (33,970 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...