Problem z przekazaniem zmiennej z DLL do Delphi

0

Mam taki kod funkcji, którą eksportuję w DLL:

int* DLL_EXPORT CDECL SomeFunction(int* myinput)
{
int r[256];
r[0] = 5;
r[1] = 25;
return r;
}

Bibliotekę ładuję za pomocą LoadLibrary, funkcja jest znaleziona. Wywołanie:

Type TIntArray = array of Integer;
var MyInput:TIntArray;
ResultArray:TIntArray;
SomeFunction:function(MyInput:TIntArray):TIntArray;CDECL;

begin
...
@SomeFunction := GetProcAddress(HDLL, 'SomeFunction');
SetLength(ResultArray, 256);
ResultArray := SomeFunction(MyInput);
//Sprawdzam czy pobralo poprawne dane
ShowMessage(IntToStr(ResultArray[0]) + #32 + IntToStr(ResultArray[1]);
end;

Niestety zamiast wartości "5 25" są tam tylko zera. Natomiast odwrotnie, czyli do funkcji Somefunction dane przesyłane są poprawnie.

EDIT: Jednak teraz sprawdziłem i w żadną stronę nie działa :/

EDIT2: Jako procedura, dane DO funkcji są przesyłane poprawnie (ze STDCALLem próbowałem).

0
int r[256];
r[0] = 5;
r[1] = 25;
return r;

Zwracasz adres zmiennej lokalnej. Nie można robić czegoś takiego.

0

Hmm, w takim razie pozostaje chyba tylko przeslac za pomoca var? Czyli somefunction(input:Tmyarray; var output:Tmyarray);
Tylko bede musial pomyslec jak to bedzie wygladac w C.

0
ResultArray := SomeFunction(MyInput);

Przypisujesz wskaźniki, na dodatek type mismatch.

Zwracasz adres zmiennej lokalnej. Nie można robić czegoś takiego.

Cóż, zapewne tutaj problem nie leży, bo nikt stacku nie wyczyścił, ale oczywiście jest to bardzo niebezpieczne.

Czyli somefunction(input:Tmyarray; var output:Tmyarray);

Najlepiej prześlij po prostu wskaźnik, który będzie wskazywał na zerowy element tablicy dynamicznej. Potem funkcja w C++ może się tym bawić bez szkód dla Delphi.
Funkcja jaką zaprezentowałeś wygląda mi na podwójne pośrednictwo.
Generalnie to jeżeli nie potrafisz korzystać z tablic dynamicznych (a widać na przykładzie, że nie potrafisz), to rezerwuj sobie pamięć albo zwykłą tablicą albo jakimś getmem bo trzeba wiedzieć jak to działa żeby to zrobić dobrze i bezpiecznie.

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