kAzek napisał(a):
Tak chyba nie zwrócisz. Raczej powinieneś spróbować przekazać tablicę jako parametr zwrotny to jakoś powinno się udać, możliwe że będzie też trzeba w kolejnym parametrze podać wielkość przekazanej tablicy.
Rzecz w tym, że taki standard narzuca aplikacja, do której mam napisać plugin. Nie mam w tym zakresie swobody ruchów. Docelowo Metoda ma przyjąć jeden parametr PChar, a oddać (no właśnie - wskaźnik na) tablicę packed record.
Udało mi się zrobić mały krok naprzód i wdaje mi się, że to jedyny logiczny kierunek - przekazanie wskaźnika:
[ComVisible(true)]
[DllExport("Function_3", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static IntPtr Function_3([MarshalAs(UnmanagedType.LPWStr)]string pParams)
{
MessageBox.Show(pParams);
int[] arr0 = new int[] { 1, 2, 3 };
MessageBox.Show("1");
IntPtr ip0 = Marshal.AllocHGlobal(3 * Marshal.SizeOf(typeof(int)));
MessageBox.Show("2");
MessageBox.Show(ip0.ToString());
return ip0;
}
procedure TForm1.Button6Click(Sender: TObject);
var
DLL : THandle;
Function3 : function(pParams: PChar): Pointer; stdcall;
p : Pointer;
begin
DLL := LoadLibrary('d:\tmp1\mMPlugin_test1.dll');
try
@Function3 := GetProcAddress(DLL, 'Function_3');
if @Function3=nil then raise Exception.Create('Bład - nie mogę znaleźć proceudry w bibliotece!');
p:=Function3(PChar('test'));
finally
FreeLibrary(DLL);
end;
end;
W takim wariancie metoda z C# jest prawidłowo wywoływana i przechodzi przez kolejne punkty kontrole (MessageBoxy), a ostatecznie tekst, który pojawia się w ostatnim z dziesiętną reprezentacją wskaźnika ip0 odpowiada wartości jaką otrzymuje zmienna p po stronie Delphi.
Natomiast - metoda działa dla int, ale jeżeli chcę zmienić na string (przy wyznaczaniu rozmiaru typu za pomocą funkcji Marshal.SizeOf) - z powrotem dostaję błąd E0434352 - podejrzewam, że chodzi o to, że string w C# jest typem zarządzanym, a Marshaling operuje na typach niezarządzanych i stąd cała heca.
Spróbuję dzisiaj przeskoczyć jeden krok i przekazać wskaźnik do struct, który będzie opakowany znacznikami Marshalingu i wtedy zobaczymy jak zareaguje Marshal.SizeOf