Przekazanie PChar z .dll napisanej Delphi

0

Wiem że jest mnóstwo przykładów do tego ale nie rozumem czemu u mnie nie działają.
Otóż mam w dll taką procedurkę:


procedure GetImie(id: integer; imie : PChar); stdcall;
var s:string;
begin
  s:= JakasFunkcja(id);  //tutaj w s mam już moje imie
  StrCopy(imie, Pchar(s));   //do zmiennej imie kopiujemy to co jest w s, czyli imie
end;

żeby odczytać tę zmienną w Delphi, używam zmiennej imie : array[0..99999] of Char;

i teraz próbuję odczytać to imię po stronie C#


[DllImport(ApiDllName, CharSet = CharSet.Ansi)]
public static extern void GetImie(int Id, [MarshalAs(UnmanagedType.LPStr)] string imie);

..............


string simie = "";    // w ten sposób program się zamyka z błędem
string simie = new string(' ', 99999);// w ten sposób nie ma błędu ale w textboxie są same spacje, czyli nic się nie zwróciło z dll

GetImie(1, simie);
textBox1.AppendText(simie.ToString() + "\r\n");

niech mi ktoś wytłumaczy co robię źle, że te wszystkie przykłady z Internetów u mnie nie działają?

0

jak chcesz żeby parametr był wyjściowy to ustaw go jako ref / out lub zamiast stringa podeślij StringBuilder choć nie jest to zalecany sposób
https://learn.microsoft.com/en-us/dotnet/standard/native-interop/best-practices#string-parameters

0

Obstawiam typy danych

rzuć okiem na tego linka
http://rvelthuis.de/articles/articles-dlls.html

0

niestety, ale nadal nie wiem o co chodzi.
Wile różnych kombinacji i nadal nie udało mi się nic osiągnąć.
Nie wiem czy przyczyna jest w C# czy w dll?

0

żeby to zadziałało to musisz przydzielić pamięć na bufor po stronie kodu, który wywoła tą metodę, czyli po stronie c#. Nie możesz tego jednak zrobić jeśli w c# masz parametr typu string - możesz zamiast tego użyć StringBuilder
albo możesz przydzielić pamięć na bufor p stronie delphi ale dodatkowo musisz mieć drugą metodę, która Ci tą pamięć zwolni - tu jest przykład https://stackoverflow.com/questions/5086645/how-to-use-delphi-dllwith-pchar-type-in-c-sharp

0

Jakiś czas temu pisałem pierwszą część artykułu o używaniu kodu natywnego w C#. Artykuł jest tutaj: https://masterbranch.pl/uzywamy-dll-pisanej-w-cpp-czesc-1/
Skupia się głównie na przekazywaniu stringów. W prawdzie przykład wykorzystuje C++, ale bez problemu przerobisz to na Delphi. PChar to po prostu char * w C++.

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