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

Klasy w DLL

Ostatnio zmodyfikowano 2016-02-21 17:10
Autor Wiadomość
marcolo2307
Temat założony przez niniejszego użytkownika
Klasy w DLL
» 2016-02-21 16:55:24
Cześć!

Próbuję stworzyć sobie klasę w DLL'ce. Udało mi się załadować bibliotekę i stworzyć obiekt. Nie mogę wywołać metody.

myDll.h
C/C++
#ifndef __MAIN_H__
#define __MAIN_H__

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

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

extern "C"
{
    class DLL_EXPORT MyClass
    {
    private:
       
    public:
        MyClass();
        ~MyClass();
        void method();
    };
    MyClass * DLL_EXPORT CreateMyClass();
}
#endif // __MAIN_H__[/cpp]


Plik ź r ó d ł owy DLL
[ cpp ] # include "myDll.h"

MyClass::MyClass()
{
    std::cout << "MyClass::MyClass()\n";
}
MyClass::~MyClass()
{
    std::cout << "MyClass::~MyClass\n";
}
void MyClass::method()
{
    std::cout << "MyClass::method()\n";
}
MyClass * CreateMyClass()
{
    return new MyClass;
}

main.cpp w osobnym projekcie
C/C++
#include <windows.h>
#include "myDll.h"

typedef MyClass *( * CMC )();

CMC CreateMyClassF;

int main()
{
    DWORD L;
    char buf[ 1024 ];
   
    HINSTANCE hDll;
    hDll = LoadLibrary( "Dll" );
   
    if( hDll != NULL )
    {
        std::cout << "Library has been loaded!\n";
        CreateMyClassF =( CMC ) GetProcAddress( hDll, "CreateMyClass" );
       
        if( CreateMyClassF != NULL )
        {
            std::cout << "CreateMyClass function is available!\n";
            MyClass * Class = CreateMyClassF();
            Class->method(); // błąd
           
        }
       
        FreeLibrary( hDll );
    }
}

Błąd to: undefined refence to "_imp___ZN...". czy aby wywoływać metody także muszę tworzyć do nich wskaźniki? W internecie znalazłem informację o tym, że metody powinny być wirtualne, ale to nic nie zmieniło. Widziałem jeszcze metodę w rodzaju korzystania z klasy dziedziczonej bez żadnych zmiennych w środku, ale jeszcze jej nie testowałem i wydaje mi się trochę nieopłacalna.
P-145122
pekfos
» 2016-02-21 16:57:18
Musisz ładować DLL dynamicznie?
P-145123
marcolo2307
Temat założony przez niniejszego użytkownika
» 2016-02-21 16:58:44
Nie muszę, ale chciałbym. Statycznie wszystko działa bez problemu.
P-145124
pekfos
» 2016-02-21 17:08:47
czy aby wywoływać metody także muszę tworzyć do nich wskaźniki?
Tak.
P-145126
marcolo2307
Temat założony przez niniejszego użytkownika
» 2016-02-21 17:10:13
Ok, dzięki. Zamykam.
P-145127
« 1 »
  Strona 1 z 1