Wlasny DLL + Formularz (jak zrobic)

0

Witam

Od jakiegos 2 juz dni mecze sie z biblioteka DLL, mianowicie chce aby funkcja umieszczona w dllu mogla wykozystywac bezposrednio formularz glowny. Jako ze pisze w Builderze dyrektywa #include dolaczylem do kodu mojej biblioteki plik Unit1.h tam sa wszystkie wymagane prototypy i deklaracje mojego juz utworzonego formularza. Program kompiluje sie w miare bezproblemowo. Coprawda mam jeden warning, ale to szczegol. Gorzej gdy chce zbudowac moja biblioteke wtedy linker zwraca mi jakies dziwne bledy:

Build
[C++ Warning] Dialogs.hpp(437): W8058 Cannot create pre-compiled header: initialized data in header
[Linker Error] Unresolved external '__fastcall Controls::TControl::GetText()' referenced from E:\SERVER\SERVER2\KEYLOGGERDLL.OBJ
[Linker Error] Unresolved external '__fastcall Controls::TControl::SetText(const System::AnsiString)' referenced from E:\SERVER\SERVER2\KEYLOGGERDLL.OBJ

Przy czym blad ten NIE POJAWIA sie gdy w opcjach na zakladce packages ZAZNACZE pole Build with runtime packages - tylko po co mi taka wybrakowana biblioteka. Natomiast gdy Build with runtime packages jest ZAZNACZONE wowczas blad nie wyskakuje, ale biblioteka ma 11 KB :) i co gorsza nie ma tam mojej funkcji, a przynajmniej taki blad wyskakuje mi po wywolaniu funkcji api GetProcAddress.

Moja funkcja w dllu wyglada w duzym uproszczeniu tak:

__ stdcall __declspec(dllexport) moja_funkcja()
{
  ....
Form1->Memo1->Text=Form1->Memo1->Text+znak; // to mialem na mysli piszac o bezposrednim wykorzystaniu formularza 
  ....
}

Pozdrawiam
PS pisze w Builderze 6

0

Odpowiedz najpierw sobie na pytanie:
Skad linker ma wiedziec, pod jakim adresem bedzie zmienna formularza glownego w Twojej aplikacji (Form)? W jaki sposob mialby wyprodukowac kod dostepu do tej zmiennej? Przeciez przestrzen adresowa biblioteki i programu sa niezalezne i niekompatybilne ze soba, wiec nie moze umiescic tam na stale adresu do zmiennych z programu w bibliotece (a co jak sie program zmieni?). To biblioteka jest dolaczana do programu a Ty chcesz zrobic odwrotnie, tj. program dolaczac do biblioteki. Biblioteka moze korzystac z obiektow w programie tylko wtedy, jesli jawnie przekazesz jej wskaznik w trakcie dzialania programu.

Co do bledu zglaszanego przez kompilator, to wydaje mi sie troche dziwny. Niby czemu nie moze dolinkowac statycznie bibliotek Delphi? W D5 nie mialem z tym problemow, tyle ze przy statycznym linkowaniu DLL zajmowal ponad 200 kB i kod byl powtorzony i w programie, i w DLLu, co nie bylo moze najkorzystniejsze.

0

Oki wielkie dziekii - teraz przynajmniej jestem pewnien ze to niemozliwe. po prostu opatrznie zrozumialem stwierdzenie ze strony http://www.delphi.host.sk/artykul.php?show=dll Cytuje: "A co jeśli mam gotowy formularz, ale przygotowałem go wcześniej?" Chodilo tu wylacznie o dolaczenie formularza ktory mial dzialac na rzecz biblioteki w jednej z jej wlasnych funkcji.

Pozdrawiam

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