Autor Wątek: DLL, rozne kompilatory, typy zmiennych przekazywanych do funkcji eksportowanych  (Przeczytany 1460 razy)

Offline duzamasa

  • Użytkownik

# Marzec 18, 2006, 15:20:10
Chce napisac biblioteke DLL, ktora bedzie mozna wykorzystac w kazdym kompilatorze jezyka C i C++ dla systemow Windows (np. Visual C++, gcc, Builder C++ itd.). Funkcje beda ekportowane z rozszerzeniem extern "C" (klas nie bedzie). Moj problem polega na tym, ze nie wiem, jakich uzyc typow zmiennych przekazywanych do funkcji ekportowanych. Czy uzyc char (zwyklego typu dla C), CHAR albo INT8 (typowego dla Windows) lub int, INT, INT16, INT32. Przyklad:
void f(char ch);    // typowe dla Cczy
void f(CHAR ch);  // typowe dla Windowsczy
f(INT8 ch);          // INT8 zdefiniowane w pliku basetsd.h i gwarantowane
W tej chwili wykorzystuje zmienne w bibliotece (typy w C):
int, unsigned int, unsigned long, floatW pliku "basetsd.h" sa typy o gwarantowanej dlugosci (np. ULONG32 - 4 bajty). Czy mam korzystac tylko z tych typow? Dodam, ze nie ma tam zdefiniowanego typu dla liczb zmiennoprzecinkowych (float).
Drugie pytanie: jak napisac ta biblioteke, aby latwo dalo sie ja wykorzystac w jezykach innego programowania pod Windows. Domyslam sie, ze bedzie trzeba odpowiednio dopasowac typy danych przekazywanych do funkcji eksportowanych. Zatem jak takie cos napisac, aby sie jak najmniej narobic w przyszlosci?  ;D


Offline Mr. Spam

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

agent_J

  • Gość
# Marzec 18, 2006, 16:33:29
Generalnie kod DLLa napisanego w C będzie można używać pod różnymi językami. Kompilator i tak rozszerza argumenty na stosie do wieloktrotności rozmiaru rejestru, czyli char i tak zajmie 4 bajty. Nie możesz zwalniać pamięci zaalokowanej przez DLL ani DLL nie może zwalniać pamięci zaalokowanej przez program. Pod linuxem biblioteki dynamiczne dzielą wspólne biblioteki (C, C++, itp.), tak że nie ma problemu z malloc(), fopen() i innymi funkcjami.
Z C++ jest problem, ponieważ różne kompilatory mają różne ABI (Application Binary Interface): różne sposoby generowania nazw, tablic metod wirtualnych, RTTI, obsługę wyjątków. Nie należy używać przekazywania argumentów w rejestrach, tylko musi być zachowana standardowa konwencja wywołania.
« Ostatnia zmiana: Marzec 18, 2006, 16:36:32 wysłana przez agent_J »