c++ Dynamiczna Biblioteka

0

Piszę nowy temat, ponieważ tamten nie był zbytnio rozchwytywany. Potrzebuję pomocy, gdyż nie potrafię dostosowywać dynamicznych bibliotek do ich żywiołu. Dokładniej nie wiem jak zrobić, żeby w .h umieścić tylko deklaracje funkcji (dostępne dla innych użytkowników nie posiadających kod źródłowy funkcji), a w .cpp umieścić ich działanie (dostępne tylko dla coder'a). Chcę, aby w przyszłości było można używać tych funkcji, tylko wtedy, kiedy .dll'ka znajduje się w odpowiednim miejscu. Np. Adam chciałby użyć funkcji z pewnej biblioteki, więc umieszcza moją dll'ke do folderu gdzie znajduje się jego program, a w swoim kodzie owy bohater umieści nagłówek nazwadll.h (chyba źle powiedziałem). Jeśli Adam użył tych funkcji i uruchomił program, a w folderze nie znajduje się omawiana dll'ka, wyskoczy błąd - program podda się zamknięciu. Wiem, za bardzo amatorsko opisane, ale mam nadzieję, że czujecie przesłanie :)

Bardzo prosiłbym, aby ktoś chętny wykonał mi to na przykładzie tej funkcji:

int Exists(const char *databasename)
{
	FILE *file; 
	char *str;
	str = new char[sizeof(databasename) + sizeof(TYPE)];
	sprintf(str,"%s%s",databasename,TYPE);
	file = fopen(str,"r");
	if(file != NULL)
	{   
	     fclose(file);
	     return true;
	}
	delete[] str;
	return false;
}
0

Zanim zabierzesz się za biblioteki dynamiczne to proponuję zająć się podstawami C++ bo ten kod jest... <tu wstaw coś mocno obraźliwego ze swojego słownika>. Buffer overflow, memleak, zbędna konwersja typu, nazwa funkcji/metody nie oddaje tego co się w niej dzieje itd.

0

Co ty opowiadasz, funkcja wykonuje to, co dokładnie oczekiwałem. Tak w ogóle nie interesuj się kodem, bo ja o coś innego prosiłem. Więc jak z tą biblioteką dynamiczną będzie, dacie przykład?

0
risen napisał(a)

Co ty opowiadasz, funkcja wykonuje to, co dokładnie oczekiwałem.

Oczekiwałeś potencjalnie exploitowalnej dziury w tej funkcji? Ciekawe. Pozwolisz, że rozowinę?

int Exists(const char *databasename)
{
        FILE *file; 
        char *str;
	/*
	 * sizeof(databasename) to zawsze sizeof(void*)
	 * ...czyli 4 lub 8, zależnie od architektury; chciałeś może strlen?
	 */
        str = new char[sizeof(databasename) + sizeof(TYPE)];
	/*
	 * heap buffer overflow jeżeli databasename jest dłuższe niż 4 znaki
	 *
	 * do tego szukasz w current working directory, co jest dyskusyjne
	 */
        sprintf(str,"%s%s",databasename,TYPE);
	/*
	 * nie sprawdzasz czy plik istnieje, sprawdzasz czy mozesz go otworzyc
	 * do odczytu w tym momencie
	 * tj. plik moze istniec ale przez to, ze jest np. otwarty przez inny
	 * program to u Ciebie jakoby nie istnieje...
	 */
        file = fopen(str,"r");
        if(file != NULL)
        {   
             fclose(file);
	     /*
	      * konwersja boola na int
	      */
             return true;
        }
	/*
	 * pamięć zwalniasz wyłącznie kiedy nie udało się otworzyć pliku
	 * co jest o tyle fajne, że podając programowi niemożliwą ścieżkę
	 * ...triggerujemy oveflowa i potencjalne wykonanie kodu potem
	 */
        delete[] str;
	/*
	 * konwersja boola na int
	 */
        return false;
}

Biblioteki dynamiczne mają się NIJAK do 'bibliotek' w Twoim rozumieniu, nagłówków i .cpp. Zajrzyj na MSDN po opis, czym są i jak się używa dllek.

0

str = new char[sizeof(databasename) + sizeof(TYPE)]; - to woła o pomstę do nieba...
Nie napisałeś w jakim IDE to piszesz, ale może trafię: http://msdn.microsoft.com/en-us/library/ms235636.aspx

0

Nie gryźcie mnie za sizeof'a, jak pisałem w innym języku to sizeof przeliczał mi znaki. Lecz tu zauważyłem, że maks 4,5 znaków wyłapuje ;p OK, dzięki za linkacza. Przejrzę dokumentacje i odezwę się : )

EDIT: deus masz rację, trochę na łapczywego to wygląda.

0

byku_guzio jesteś nieoceniony, dziękuję. Teraz rozumiem jak to działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1