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

[DLL] Co tak naprawdę można bezpiecznie eksportować?

Ostatnio zmodyfikowano 2017-09-11 20:13
Autor Wiadomość
golibroda13
Temat założony przez niniejszego użytkownika
[DLL] Co tak naprawdę można bezpiecznie eksportować?
» 2017-09-11 18:17:38
Dzień dobry, chciałbym się zapytać o następującą kwestię tego co może być w interfejsie DLLki a co być nie powinno.

Chciałbym móc wystawić np. zmienną tekstową:
C/C++
std::string GetString();

Jednakże, jak dobrze rozumiem, inny kompilator może zastosować inny alignement klasy albo inną kolejność pól, jeżeli
std::is_trivial < std::string >::value == 0
. (1.) Czy zatem poprawne będzie zrobienie:

C/C++
const char * GetString()
{
    static const char * str = "Content";
    return str;
}
?

(2.) Czy to niesie za sobą jakieś dodatkowe zagrożenia? Tutaj myślę o zwalnianiu pamięci. Czy standard daje mi jakieś gwarancje, co do czasu życia zmiennej z DLLki?


Chciałbym również zweryfikować swoją wiedzę:

(3.) Jeżeli klasa jest typem trywialnym to można ją bezpiecznie zwrócić z DLLki, jeżeli alignement się zgadza.

Aczkolwiek to również generuje moje kolejne pytanie: (4.) Czy rodzaj kompilatora ma wpływ na alignement czy jest to zależne od platformy i np. Clang i GCC muszą na tym samym 32bitowym Windowsie wypluć klasy z tym samym alignementem?

Bonus:
(B.) Ktoś może polecić jakieś dobre materiały (najlepiej polski ale angielskie też ok) na temat interfejsu binarnego C++a oraz tego jak poprawnie przygotować interfejs DLL, na jakie zagrożenia uważać, jak obsługiwać pamięć za pomocą własnych funkcji?
P-164791
Kinexity
» 2017-09-11 18:50:32
Skoro jest to wskaźnik, to pamięć nie zostanie zwolniona automatycznie - chyba przespałeś fragment, gdy czytałeś o wskaźnikach...
P-164795
golibroda13
Temat założony przez niniejszego użytkownika
» 2017-09-11 19:06:41
@Kinexity, nawet nie wiem czy chce mi się ci odpisywać, ale niech stracę:

Tutaj jest wskaźnik, owszem ale na zmienną, która będzie trzymana w pamięci statycznej DLLki (a dodatkowo do literału, który i tak by tam się znalazł bez słowa
static
). Nie trzeba jej zwalniać ani alokować gdyż pamięć statyczna leży w gestii systemu operacyjnego. Wskaźnik będzie tak długo ważny jak w pamięci będzie ta DLLka. Pytanie polega na tym, czy system gwarantuje mi, że DLLkę zwolni (a zarazem statyczną pamięć DLLki) zawsze po zamknięciu mojego programu, który z niej korzysta. Czy istnieje ryzyko, że z jakiegoś powodu system zdecyduje zmienić miejsce DLLki w pamięci (nie wiem, zrzuci ją do pamięci wirtualnej a potem wrzuci w inne miejsce) albo uzna za nieużywaną i zwolni ją przed końcem życia mojej aplikacji. Czyli dokładniej mówiąc czy istnieje ryzyko, że pobrany z DLLki adres straci swoją ważność i zacznę posługiwać się nieważnym wskaźnikiem.

Szczerze powiem, że spodziewałem się trochę bardziej rzeczowych odpowiedzi.
P-164796
Luq
» 2017-09-11 19:31:43
Wskaźnik będzie poprawny dopóki dll jest załadowane do pamięci procesu. Czyli do zakończenia procesu lub do zwolnienia dll przez
FreeLibrary
P-164797
j23
» 2017-09-11 20:13:20
2) Jeśli dołączasz bibliotekę przez LoadLibrary, może być problem ze zwalnianiem pamięci - biblioteka i aplikacja może korzystać z różnych stert lub różnych bibliotek standardowych.
P-164804
« 1 »
  Strona 1 z 1