Entwickler-Ecke

Basistechnologien - PChar und marshalling


Boldar - Fr 22.11.13 18:52
Titel: PChar und marshalling
Hi,
ich muss in C# eine dll erstellen, die aus einer (existierenden) Delphi-Anwendung aufgerufen werden soll.
Da ich ungern den weg über eine Proxy-dll gehen möchte, habe ich mir dieses projekt [https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports] rausgesucht.
Das exportieren ansich funktioniert auch. Ich muss nun (vereinfacht) folgende Funktionen exportieren (das sind die aufrufe in delphi):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    Msg = record
        a: dword;
        b: Array [0..7of byte;
        c: word;
        F: byte;
        t: TDateTime;
     end;


eeptype = record
        ID:   dword;
        Version:       dword;
        Date:          PChar32;
        PStr:    PChar32;
        CStr:   PChar32;
     end;
...


function  GetInfo(ID:Rec): eeptype; stdcall  // Wie records übergeben?
function  Open(var ID:Rec):PChar256; stdcall   // Wie PChar ausgeben?


Da habe ich die genannten probleme. Könnte mir da jemand ein Beispiel geben zu?
lg Boldar

Edit: das Delphi war Delphi7, also nicht-unicode.


Boldar - Di 26.11.13 00:00

Kann mir denn niemand gelfen?


Th69 - Di 26.11.13 11:47

Hallo,

ich probiere es mal (zumindestens mit helfen ;-)...

PChar ist doch einfach ein Zeiger auf einen nullterminierten String (C-String), oder?
Dann kannst du in C# dafür einfach string benutzen (der .NET Marshaller macht dies bei C-DLLs, z.B. bei WinAPI Aufrufen, genauso).

Was meinst du aber mit 'Rec'? Soll dies der Msg-Record sein?

P.S: Generell zum Marshallen kann ich dir den PInvoke Interop Assistant [http://clrinterop.codeplex.com/releases/view/14120] empfehlen. Du müsstest dann nur deine Delphi-Records in ein C-Struct umschreiben. Dann erzeugt dir der "PInvoke Interop Assistant" den nötigen C#-Code, denn du dann evtl. noch ein bißchen anpassen mußt (falls die Datentypen doch nicht exakt stimmen).