Results 1 to 10 of 10

Thread: C# calls Delphi DLL

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    C# calls Delphi DLL

    Ik ben een DLL aan het maken die (vraag me even niet waarom) vanuit C# aangeroepen moet.
    Dat werkt.
    Maar de methode die aangeroepen wordt moet een stuk geheugen pakken en dit stuk geheugen teruggeven aan C#.
    Een array of byte dus. Is dat veilig te doen? Hoe pak ik geheugen?

    Wanneer ik in C# een Byte[] byteArray = new Byte[1000] maak, en deze als "ref" PByte doorgeef aan de DLL gaat dat goed.
    Maar ik weet vantevoren niet hoeveel bytes terug gaan komen.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik weet niet veel van interop, maar misschien via COM marshalling, iow safearrays? http://docwiki.embarcadero.com/RADSt.../en/SafeArrays

    http://docs.embarcadero.com/products...rayCreate.html
    Last edited by marcov; 20-Feb-20 at 19:10.

  3. #3
    Ik heb het nog nooit toegepast, maar je zou dit met ShareMem op moeten kunnen lossen;
    http://docwiki.embarcadero.com/RADSt...Sharing_Memory

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    sharemem vereist dat beide delen de borlandmm.dll memory manager gebruiken. Hoe wil je .NET daar van overtuigen?

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    nee geen sharedmem..
    is een getmem() een een pointer naar bytearray[0] teruggeven geen optie?

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Alleen als OF de andere kant (C#) dezelfde memory manager gebruikt die dat kan freeen, OF als .NET hem niet zelf dealloceert (hoe dat af te dwingen), en de pointer aan de Delphi code teruggeeft om te freeen.

    Dat laatste is hoe je het typisch doet met C++/C.

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ja dat is een optie: een of andere handle doorgeven aan de DLL en een extra method FreeBytes() maken. Jammer.. het zijn maar bytes tenslotte hahaha.

  8. #8
    geheugen laat mij even in de steek maar is ook in windows API calls vaak niet zo'n issue met het ophalen van string\buffer lengtes etc. Eerste keer aanroepen van de functie geeft dan de lengte en de tweede keer aanroepen van de functie geeft je de string\buffer terug.

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Dat is meer een *nix conventie. Ik geloof Windows is meer pointer + lengte en een returncode als het niet past, met de lengte aangepast tot de minimale grootte. Als calls mogelijk "duur" zijn (syscalls en cross-process zoals COM) dan is dat een betere oplossing, omdat dan de meeste gevallen met een call afgehandeld kunnen worden.

    Zie ook https://stackoverflow.com/questions/...932916#1932916

  10. #10
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Ik heb het opgelost door 3 functies te maken
    1. generate(out aSize: Integer; out aIndexToHandle: Integer); -> deze bewaart intern zijn resultaat e.e.a. in eigen mem
    2. getbytes(aIndexToHandle: Integer; ptr: Pointer; aSize: Integer); kopieert bytes naar door caller gealloceerde buffer
    3. freebytes(aIndexToHandle: Integer); -> geeft interne geheugen vrij

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •