logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak stworzyć własną bibliotekę w C++ Builder? Szukam prostego wyjaśnienia

Remeknapr 14 Lis 2007 10:57 8144 14
REKLAMA
  • #1 4479389
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    Witam

    Na stronie:

    http://www.pcworld.pl/artykuly/41644.html

    znajduje się opis tworzenia własnej biblioteki. Czy ktoś mógłby przetłumaczyć ten opis na język zrozumiały dla człowieka i wyjaśnić jak stworzyć własną bibliotekę? Ewentualnie podać link do sensownego opisu?
  • REKLAMA
  • #2 4483439
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Remeknapr napisał:
    Witam

    Na stronie:

    http://www.pcworld.pl/artykuly/41644.html

    znajduje się opis tworzenia własnej biblioteki. Czy ktoś mógłby przetłumaczyć ten opis na język zrozumiały dla człowieka i wyjaśnić jak stworzyć własną bibliotekę? Ewentualnie podać link do sensownego opisu?


    Dlaczego sam nie sprobujesz zrozumiec tego materialu. z czym masz problemy?
  • REKLAMA
  • #3 4484182
    Konto nie istnieje
    Konto nie istnieje  
  • #4 4484806
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    one_eddie napisał:
    Dlaczego sam nie sprobujesz zrozumiec tego materialu. z czym masz problemy?


    Skąd ten wniosek? Podchodzę do tego materiału już któryś raz i nie mogę dojść do szczęśliwego końca.

    Roch Brada napisał:
    Przeczytaj kilka razy - za którymś w końcu zrozumiesz.

    P.S: Użyj Dll Wizard i stworzy Ci pusty projekt. Skompiluj i masz plik dll.


    Może dla Was jest to proste, bo umiecie to robić, ale dla mnie ten tekst jest niespójny. Robię wszystko krok po kroku i w pewnym miejscu nie wiem co dalej. Nie zgadza mi się działanie kompilatora z opisem. Proszę o życzliwą wyrozumiałość. Jak wreszcie przez to przebrnę to może sam się zdziwię, że czegoś nie rozumiałem. Plik DLL udało mi się zrobić, natomiast nie wychodzi program mający ją wykorzystywać.

    Może opiszę co mi nie wychodzi:

    Tworzę katalog o nazwie DLL, a w nim dwa podkatalogi: NaszDll i Program. Uruchamiam Buildera i dalej... wszystko w załączniku, aby nie zaśmiecać postu. Po wszystkim usunę załącznik.

    Pozdrawiam
    Załączniki:
    • Dll.zip (3.37 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 4484922
    Konto nie istnieje
    Konto nie istnieje  
  • #6 4485476
    Tomek-85
    Poziom 14  
    Posty: 86
    Pomógł: 7
    Ocena: 1
    Jeżeli zechcesz załadować .dll dynamicznie musisz użyć funkcji
    z biblioteki winAPI
    1. LoadLibrary("nazwa_twojej_biblioteki.dll"); funkcja zwraca uchwyt
    biblioteki typu HINSTANCE.
    2. GetProcAddress(uchwytDll,"nazwa_funkcji_z_biblioteki"); funkcja
    zwraca wskaźnik funkcji której chcesz używać.
    3.FreeLibrary(uchwytDll); tego chyba komentować nie trzeba . . .

    Oczywiście przed wywołaniem LoadLibrary i GetProcAddress
    powinieneś zadeklarować zmienną typu Hinstance i oczywiście
    wskaźnik do funkcji którą będziesz używać.
    (mogę powiedzieć, że wyżej wymieniona operacja
    jest trochę trudna dla osób początkujących).
    Chcesz wiedzieć więcej? napisz a pomogę :)
  • REKLAMA
  • #7 4485713
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    Roch Brada napisał:

    //2
    extern "C" __export int __stdcall Test1(AnsiString);

    Zrobiłem tak:

    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    #pragma argsused
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
    {
            return 1;
    }
    
       extern "C" __export int __stdcall Test1(AnsiString);


    Roch Brada napisał:
    implib -c -f nazwa_biblioteki nazwa_biblioteki.dll

    Cytat z helpa implib.exe:

    "Syntax: IMPLIB [options] libname[.lib] [@respfile | srcname] [srcname ...]"

    Zrobiłem plik wsadowy:

    C:\Progra~1\Borland\CBuilder6\Bin\implib -c -f Dll Dll.dll Dll


    Roch Brada napisał:
    Powstanie plik nazwa_biblioteki.def.

    Nie powstał. Dostałem komunikat:

    "Warning duplicate symbol: ___CPPdebugHook"

    I faktycznie. W hexedytorze w pliku Dll.lib widać dwa wpisy, jeden za drugim. Gdzie tkwi błąd?

    Dodano po 10 [minuty]:

    Tomek-85 napisał:
    Jeżeli zechcesz załadować .dll dynamicznie musisz użyć funkcji
    z biblioteki winAPI
    1. LoadLibrary("nazwa_twojej_biblioteki.dll"); funkcja zwraca uchwyt
    biblioteki typu HINSTANCE. ...


    Te operacje są mi doskonale znane z Masm32. Piszę trochę w asemblerze. Jest to tzw. ręczne ładowanie biblioteki. Można też "automatycznie". Załatwi to system jeśli do pliku źródłowego programu dodamy deklarację plików nagłówkowych tej biblioteki:

       include    C:\masm32\include\nazwa_bibl.inc
       includelib C:\masm32\lib\nazwa_bibl.lib
    

    Chciałbym podobnie zrobić w C++ przez dołączenie właściwego pliku nagłówkowego, ale powoli. Nie od razu Kraków...
  • #8 4486578
    Konto nie istnieje
    Konto nie istnieje  
  • #9 4486783
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    Roch Brada napisał:

    I nie powstanie bo robisz tak:
    Cytat:
    C:\Progra~1\Borland\CBuilder6\Bin\implib -c -f Dll Dll.dll Dll

    Spróbuj zrobić tak:
    C:\Progra~1\Borland\CBuilder6\Bin\implib -c -f Dll Dll.dll

    Ewentualnie sprawdź w helpie składnie polecenia impdef


    Oczywiście w pierwszej kolejności zrobiłem tak, jak miałem napisane. Wówczas nic się nie dzieje. Nie ma żadnego komunikatu, a plik .def nie powstaje. W związku z tym po przeczytaniu helpa:
    Syntax: IMPLIB [options] libname[.lib] [@respfile | srcname] [srcname ...]

    zacząłem dokładać składników z wiadomym skutkiem. W asemblerze plik definicji musi być utworzony przed kompilacją. Nie o to przypadkiem chodzi? Może ktoś ma na dysku jakiegoś "gotowca" (przykład, który mógłbym przeanalizować i zrozumieć o co chodzi)?

    Pozdrawiam
  • #10 4487014
    Konto nie istnieje
    Konto nie istnieje  
  • #11 4487098
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    Roch Brada napisał:
    Pisałeś, że zrobiłeś jakiś plik wsadowy. Po co?

    Dla wygody. Co jest złego w pliku wsadowym?

    Roch Brada napisał:
    Może tym sposobem zrobić plik definicji z dowolnej dll'ki. Spróbuj wyeksportować z jakiejś systemowej typu Kernel32.dll.

    Dzięki tej podpowiedzi zrobiłem z Kernel32 plik Kernel32.lib. DLL.lib też mi się tworzył, ale ja szukałem Dll.def. Nazwa implib powinna mi coś powiedzieć.
  • REKLAMA
  • #12 4487113
    RhinoRace
    Poziom 17  
    Posty: 127
    Pomógł: 21
    Ocena: 1
    alez kombinujecie
    wystarczy stworzyc dwa projekty:
    jeden to prejekt biblioteki dll
    drugi - projekt programu

    w pierwszym dajemy:
    extern "C" __declspec(dllexport) typ __stdcall Nazwa();
    
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    	return 1;
    }
    
    typ __stdcall Nazwa()
    {
    	//instrukcje
    }


    w drugim w pliku naglowkowym dojamy:
    extern "C" __import typ __stdcall Nazwa();
    typedef typ __stdcall (*pcNazwa)();


    a w pliku wykonywalnym:
     HINSTANCE Library;
    			Library=LoadLibrary("sciezka do pliku");
    			if (Library)
    			{
    				FARPROC _Nazwa=GetProcAddress(Library,"Nazwa");
    				if (_Nazwa)
    				{
    					_Nazwa()
    					instrukcje
    				}
    
    			}
    			FreeLibrary(Library);


    kompilowanie:
    pierwszy kompilujemy tak: Project -> Build All Projects - i to wszystko, juz mamy plik dll
    drugi projekt kompilujemy normalnie i uruchamiamy

    w razie watpliwosci pliki z kodem:
    TrescDLL.cpp - zawartosc przykladowego pliku dll
    Tresc.cpp - zwartosc programu korzystajacego z pliku dll
    Tresc.h - plik naglowkowy
    Załączniki:
    • TrescDLL.cpp (1.66 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Tresc.cpp (1.03 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Tresc.h (1009 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #13 4487117
    Konto nie istnieje
    Konto nie istnieje  
  • #14 4487147
    RhinoRace
    Poziom 17  
    Posty: 127
    Pomógł: 21
    Ocena: 1
    a po co sie bawic z plikami .def i .lib skoro bez nich tez dziala :) - przynajmniej u mnie dziala bez problemow :D
  • #15 4488705
    Remeknapr
    Poziom 33  
    Posty: 3808
    Pomógł: 138
    Ocena: 186
    Roch Brada napisał:

    Znaczy się działa?

    implib.exe tworzy plik *.lib
    impdef.exe tworzy plik *.def


    Działa? A kto to napisał:

    "C:\Progra~1\Borland\CBuilder6\Bin\implib -c -f Dll Dll.dll
    Powstanie plik nazwa_biblioteki.def."

    Wiesz ile się naszukałem błędu? Pozostawię to bez komentarza.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy tworzenia własnej biblioteki DLL w środowisku C++ Builder, ze szczególnym uwzględnieniem problemów z kompilacją i wykorzystaniem plików .dll oraz generowaniem plików .def i .lib. Użytkownik poszukuje prostego, zrozumiałego wyjaśnienia procesu tworzenia biblioteki oraz przykładowych materiałów. W odpowiedziach opisano krok po kroku tworzenie projektu Dynamic-link library w C++ Builder, eksportowanie funkcji za pomocą __export lub __declspec(dllexport), a także statyczne i dynamiczne ładowanie biblioteki (LoadLibrary, GetProcAddress, FreeLibrary). Podkreślono, że najpierw należy skompilować gotową DLL, a następnie użyć narzędzia implib.exe do wygenerowania pliku .lib, natomiast plik .def można wygenerować narzędziem impdef.exe. Wskazano, że pliki .def i .lib nie zawsze są konieczne do poprawnego działania. Omówiono także typowe błędy, takie jak duplikaty symboli podczas generowania plików importowych. Zaproponowano tworzenie dwóch projektów: biblioteki DLL i programu ją wykorzystującego, z odpowiednimi deklaracjami funkcji i dynamicznym ładowaniem biblioteki. Całość podkreśla potrzebę dokładnego zrozumienia procesu i stosowania właściwych narzędzi w odpowiedniej kolejności.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA