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

[c++] [delphi] Implementacja DLL w C++ do użycia w Delphi - czy będzie kompatybilna?

prokopcio 26 Maj 2018 22:37 786 3
REKLAMA
  • #1 17242423
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Witam.
    Chciałbym zlecić koledze napisanie w c++ kilku funkcji które chciałbym wykorzystać u siebie w delphi - wydaje mi się, że da się to wygodnie zrobić przez dll. Chodzi o przetworzenie pliku - ja przekazuję jako parametr nazwę pliku a on zwraca dane (tablicę rekordów) - w tej chwili wywołuję jego program z parametrem a on tablicę zapisuje do pliku który ja sobie zaczytuję... mało profesjonalne ale działa.
    nie używałem dll, czy stworzona w c++ dllka będzei działała bezproblemowo w delphi ?
  • REKLAMA
  • Pomocny post
    #2 17242705
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Te rekordy są stałej czy zmiennej długości? Czy znana jest ich ilość?

    Generalnie, przekazując z/do dll dane można to na kilka sposobów zrobić. Najczęściej preferowany przez MS, to odpytanie DLL o to, ile danych potrzebuje (jeśli nie jest to stały rozmiar), rezerwacja pamięci i przekazanie wskaźnika do tego obszaru, w którym DLL zapisuje, a caller sobie może to czytać i zwolnić.

    Drugi sposób to DLL sama rezerwuje pamięć, zwraca do callera wskaźnik, ten sobie czyta, a następnie wywołuje w DLL funkcję, która nakazuje już zwolnić zaalokowaną w DLL pamięć (w tym przypadku DLL musi być cały czas załadowana).

    Generalnie zasada jest taka - nie mogą zarządzać pamięcią dwie strony. Alokacja i zwolnienie zawsze musi być po jednej stronie tylko. Natomiast czytać/pisać w tym obszarze mogą obie strony (oczywiście zakładam, że DLL jest ładowana i staje się częścią procesu callera).

    PS. Gdyby trzeba było przekazywać treść zmiennej długości - nie baw się w Stringi Delphiowe... Najprościej na PChar, czyli char* w C.

    * Używam pojęcia callera, bo to może być tak EXE jak i inna DLL, czyli generalnie proces.
  • REKLAMA
  • #3 17242910
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    ok, nowe okoliczności - nowe założenia - operuję na tablicach dwuwymiarowych czyli rekordy o stałej długości (wektory xy) o różnych wielkościach - zamierzam taką tablicę (wskaźnik do niej) przekazać funkcji dll która po przetworzeniu danych zwraca mi nową tablicę (inny, nieznany mi rozmiar). Z tego co piszesz to wydaje mi się najrozsądniej zrobić tak:
    - ładuję dll
    - przekazuję wskaźnik + rozmiar tablicy do funkcji
    - otrzymuję wskaźnik do nowej tablicy + rozmiar od funkcji
    - po "wykorzystaniu" danych wywołuję funkcję dll nakazującą zwolnienie pamięci

    Dodano po 8 [minuty]:

    a jeszcze dopytam - moje aplikacje napisane w delphi nie wymagają instalacji przez klienta żadnych dodatków - czy przy podłączeniu dll c++ do delphi będzie wymagane instalowanie jakiś składników .net lub czegoś jeszcze ? - wybacz za prymitywne pytanie ale ja jestem kiepski w tych sprawach, zresztą to dział początkujący....
  • Pomocny post
    #4 17243033
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    To masz dwie - jedną przekazujesz, a drugą zwracasz. Nie rób tak, żeby przekazać wskaźnik i odebrać inny, bo się łatwo w pułapki wpędzisz w projektowaniu - po prostu nieintuicyjne to by było. Uważaj z tablicami dwuwymiarowymi, bo nie jestem do końca pewny, który wymiar jest jak traktowany między Delphi a C. Może bezpieczniej będzie posługiwać się formalnie jednowymiarową, a samemu określić wymiary (podaj je w parametrze).

    Funkcję w DLL bym podzielił - 1. Przekazuejsz tablicę i wymiary. 2. Otrzymujesz wymiary pod nową. Tworzysz ją. 3. Przekazujesz nową do kolejnej funkcji, która wypełni utworzoną.

    Jeśli w Delphi utworzysz exe/dll w Win32 oraz w C także w win32 to nie wymaga żadnych cudów. Jeśli jednak np. ta w C będzie w .NET, to zdaje się, że trochę zabawy jest (nigdy nie pracowałem z tą platformą, raz tylko książkę dawno temu przeczytałem ;p). Jeśli w C byłaby w np. w MFC (tylko po co?) to będzie potrzeba biblioteki z MS Visual C++ Redistribuate. (msvc....dll jak dobrze pamiętam). Ale najlepiej po prostu utworzyć w platformie Win32 i przy wykorzystaniu góra WinAPI.
REKLAMA