std:: string z DLL a Delphi

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*

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ć.

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).

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/docs/classDcmFileFormat.html#aabd61807a1325243b298ff80bd03a07f
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 **

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