Autor Wątek: problem z wykozystaniem std w DLL  (Przeczytany 1782 razy)

Offline Ed

  • Użytkownik

# Luty 07, 2007, 01:43:55
Witam !

Gdy w mojej dll-ce uzywam np. std::string pojawia mi sie warning :

class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'Test'
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Ax=std::allocator<char>
        ]

Takie sam problem jest z każdym obiektem std.

Nastepnie gdy, uzywam klasy Test to pokazuje mi sie błąd : "Nie odnaleziono punktu wejścia procedury".
Jak temu zaradzić ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

st3tc

  • Gość
# Luty 07, 2007, 08:05:32
Uprzedzając wypowiedzi fanatyków anty-export-stl-owych :), że czegoś z STL-em sie nie exportuje:

Wyłącz tego warninga. Visual-owy kompilator jest po prostu *GŁUPI*

Co do reszty - pewnie źle exportujesz/importujesz klasę Test. Niestety nie podałeś ani błędu wyrzucanego przez linker, ani kawałka kodu. Możliwe, że tylko exportujesz :) itp itd.

Offline Ed

  • Użytkownik

# Luty 07, 2007, 12:36:13
Problem polega na tym że błąd jest spowodowany tym warningiem.


st3tc

  • Gość
# Luty 07, 2007, 13:26:03
Jeżeli naprawdę zależy Ci na odpowiedzi to proponuję nie czarować obrazkami tylko pokazać kod :). Na 100% coś robisz źle. Zarówno w dll jak i exe musi być ta sama wersja STL. I pewnie jest. I pewnie błąd jest w czym innym, może w tym, że chcesz importować takie cudo:

public: __thiscall Test::Test::Test::Test(class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> >,enum Test::FILETYPE,enum Test::FILEMODE,bool)

Mi to wygląda na konstruktor klasy Test o parametrach ( std::string, FILETYPE, FILEMODE, bool ) który wpadł pewnie w jakieś namespacesiki lub inne cuda :). Zapewne wyeksportował się poprawnie, tylko przy kodzie gdzie sie importuje popsułeś. Sprawdź dependency walkerem co eksportuje DLL a co importuje EXE (DepWalk jest w PSDK)
« Ostatnia zmiana: Luty 07, 2007, 13:39:36 wysłana przez st3tc »

Offline Charibo

  • Redaktor

# Luty 07, 2007, 18:53:03
a extern "C" masz?
albo

#ifdef _MOJEDLL_
    #define dllfunc __declspec(dllexport)
#else
    #define dllfunc __declspec(dllimport)
#endif

...

HRESULT dllfunc JakasFunkcja(...);
To takie raczej strzaly, bo nic konkretnego nie wiadomo :)

Offline khak

  • Użytkownik

# Luty 08, 2007, 10:47:04
extern "C"

Jest wymagany przy korzystaniu z GetProcAddress(). Oczywiście wyklucza to używanie klas jako parametrów lub wartości zwracanej funkcji. Nie do końca to prawda, bo można korzystać z void * lub void **.

P.S.: A może gadam głupoty? :)