std:: string z DLL a Delphi

Odpowiedz Nowy wątek
2019-10-16 15:24
0

Używam biblioteki która jest w C++
chce opakować pewne klasy/metody aby można to było użyć w Delphi

W jaki sposób powinna wyglądać przekazywanie tekstu w obie strony ?

Z racji ze nie używam za często c++ to pierwsze co widzę to "c_str()" która zwraca char*

Pozostało 580 znaków

2019-10-16 17:07
2
AdamCe1987 napisał(a):

W jaki sposób powinna wyglądać przekazywanie tekstu w obie strony ? […] Z racji ze nie używam za często c++ to pierwsze co widzę to "c_str()" która zwraca char*

Typowy sposób to przekazywanie wskaźnika na ciąg znaków, czyli PChar albo jawny PAnsiChar lub PWideChar, w zależności od typu wykorzystywanego w bibliotece.

Napisz coś więcej na temat tej biblioteki i programu, który ma z niej korzystać.


edytowany 1x, ostatnio: furious programming, 2019-10-16 17:08

Pozostało 580 znaków

2019-10-16 18:27
4

Przekazanie to jedno, ale trzeba dobrze przemyśleć zarządzanie pamięcią – która strona alokuje i zwalnia stringa (i musi być to ta sama strona, chyba że naprawdę wie się co się robi).

Pozostało 580 znaków

2019-10-17 23:37
0

Biblioteka z której chce skorzystać to https://github.com/DCMTK/dcmtk
lata temu popełniłem program który operował na danych dicom ,
projekt wraca tylko ze już nowsza wersja Delphi, cześć komponentów było kupionych ale bez źródeł , wiec trochę zabawy bedzie.

Widac subtelne różnice pomiędzy C++ a Pascalem

np. taka metoda DcmFileFormat.saveFile
https://support.dcmtk.org/doc[...]61807a1325243b298ff80bd03a07f
Funkcja saveFile zwraca stan operacji jako obiekt i to trochę jest dla mnie istotne aby odczytac stan operacji
po stronie Delphi

Ja to zaimplemetowalem tak

#if defined(_WIN32)
#define C_EXPORT  extern "C" __declspec( dllexport )
#else
#define C_EXPORT extern "C"
#endif
    typedef DcmFileFormat *PDcmFileFormat;
    typedef OFCondition *POFCondition;
    typedef DcmDataset *PDcmDataset;
    typedef DcmTag *PDcmTag;
    typedef char* PWideString;

// w zaleznoci od parametrow kompilacji cmake mam rozne typy danych 

   #if (defined(WIDE_CHAR_FILE_IO_FUNCTIONS) || defined(WIDE_CHAR_MAIN_FUNCTION)) && defined(_WIN32)
    typedef wchar_t* OFFilenamePas; // OFFilename po stronie pascala 
   #else
    typedef char* OFFilenamePas; // OFFilename po stronie pascala  
   #endif

    C_EXPORT POFCondition DcmFileFormat_SaveFile(PDcmFileFormat p_DcmFileFormat, OFFilenamePas fname, const E_TransferSyntax writeXfer = EXS_Unknown )
    {
        OFCondition wynik = p_DcmFileFormat->saveFile(fname, writeXfer);
        POFCondition co = new OFCondition(wynik);
        return co;
    }

wersja po stronie pascal

function DcmFileFormat_SaveFile(p: PDcmFileFormat; c: pchar; writeXfer: E_TransferSyntax=EXS_Unknown): POFCondition;stdcall; external PAS_DCMTK_DLL;

Wywołanie funkcji zwraca wskaźnik do obiektu w którym jest stan operacji :) Abym mógł sprawdzić stan operacji
Tylko ze jak go nie zwolnię to jest wyciek pamięci :)

W kodzie DCMTK widzę nagminne używanie klas jako rekordów

Wszystkie funkcje ktore zwracaja wskaźnik na obiekt "POFCondition" moge przerobic na procedury z dodatkowym parametrem gdzie bedzie zwracany POFCondition

Dzialac dziala , ale troche upierdliwe użycie c++ w Delphi

edytowany 3x, ostatnio: furious programming, 2019-10-18 00:07

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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