Subj. Chciałbym użyć ciągi zamiast PChar dlatego że oszczędza mi wiele casting, ale jeśli po prostu zrobićCzy można bezpiecznie przekazywać parametry ciągów stałych Delphi na granicach menedżera pamięci?
procedure SomeExternalProc(s: string); external SOMEDLL_DLL;
a następnie wdrożyć go w jakimś innym projekcie z niewspólną menedżera pamięci:
library SeparateDll;
procedure SomeExternalProc(s: string);
begin
//a bla bla bla
//code here code here
end;
Mam (formalnie) brak gwarancji Delphi nie decyduje z jakiegokolwiek powodu, aby zmienić ciąg znaków, zmodyfikować swój licznik odwołań, duplikować lub wyróżniać go, czy cokolwiek innego. Na przykład:
var InternalString: string;
procedure SomeExternalProc(s: string);
begin
InternalString := s;
end;
Delphi inkrementuje licznik i kopiuje wskaźnik, to wszystko. Chciałbym, żeby Delphi skopiowała dane. Czy zadeklarowanie parametru jako "const" czyni go bezpiecznym z tego powodu? Jeśli nie, czy jest jakiś sposób na zrobienie tego? Deklarowanie parametr jako PChar nie wydaje się być rozwiązaniem, ponieważ trzeba oddać to za każdym razem:
procedure SomeExternalProc(s: Pchar); forward;
procedure LocalProc;
var local_s: string;
begin
SomeExternalProc(local_s); //<<--- incompatible types: 'string' and 'PAnsiChar'
end;
Dlaczego nie chcesz używać współużytkowanego MM? Dopóki używasz typu string związanego z Delphi, nie może to być zwykła biblioteka DLL z innych języków. Po co więc unikać dzielenia się MM? –
Typ ciągu jest dość zgodny, może być interpretowany przez inne języki jako PChar. Nie mówię tu o zwrocie ciągów, oczywiście tylko o ciągach znaków. – himself
... czy paczki? –