Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Korrektes Mashalling in Framework 4.0
ismirschlecht
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

Korrektes Mashalling in Framework 4.0

beantworten | zitieren | melden

Hallo,

ich muß eine Delphi - Dll ansprechen, d.h. von C# (Visual Studio 2010) aus nutzen.
Die Dll ist erstellt, es handelt sich um eine kleine Sammlung von Funktionen, die nur denkbar einfachste Typen zurückgeben: PChar und integer.

Die Deklaration der externen Funktionen sieht so aus:

       [DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern string  IO_anzahl_string();
        [return: MarshalAs(UnmanagedType.AnsiBStr)]     // Zeile X
        
        [DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]
        public static extern int  IO_read_E(  int device);

       [DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]
        public static extern int  IO_read_A( int device);


Bzgl. Mashalling bin ich noch ziemlich unbeleckt.
Folgendes Rätsel: Lasse ich die Zeile X drin werde ich beim Aufruf von
IO_Read_E(...) volgenölt, der Rückgabewert könne nicht gemarshallt werden, und ich müßte mittels [MarshalAs(UnmanagedType.U4)] oder ...I4 vermitteln.
Half selbstredend nichts. Komischerweise finktionierte die NÄCHSTE Funktion in der Aufzählung wieder klaglos (IO_read_A() )
Kommentiere ich Zeile X aus, funktionieren alle Funktionen.
Wie weit wirkt diese [return: ...] Klausel ?
Ist das Auskommentieren überhaupt der Grund fürs Funktionieren von IO_read_E() oder nur Zufall ?
Falls jemand eine Idee hat...

ism
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 790

beantworten | zitieren | melden

Das Attribut bezieht sich immer auf die folgende Methode, d.h. dein [return: ...] bezieht sich auf IO_read_E, nicht auf die vorhergehende Methode IO_anzahl_string - und daher auch die Fehlermeldung ;-)
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

das [return: ...] is tein Attribut und gilt für die Funktion, vor der es steht, bei Dir also genau auf die Funktion IO_read_E.
Dass ein int nicht zu einem AnsiBStr gemarshalt werden kann, ist ja auch nachvollziehbar.

Gruß, MarsStein

zu spät, aber jetzt isses geschrieben...
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
ismirschlecht
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke für die Antworten.
Das ist hübsch, die falsche Reihenfolge hatte ich nämlich aus dem allwissenden Internätt.
Man lernt nie aus.
Also wäre

    [DllImport("forindll.dll", CallingConvention = CallingConvention.StdCall) ]        
    [return: MarshalAs(UnmanagedType.AnsiBStr)]     // Zeile X
    public static extern int  IO_read_E(  int device);


eine mögliche korrekte Form...
MfG,
ism.
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Der Typ PChar auf der Delphi-Seite ist ja "klug" gewählt, denn da kann es sich - abhängig von der Delphi-Version - um einen PAnsiChar oder einen PWideChar handeln.
private Nachricht | Beiträge des Benutzers
ismirschlecht
myCSharp.de - Member



Dabei seit:
Beiträge: 47

Themenstarter:

beantworten | zitieren | melden

Es handelt sich um Delphi 7, und es wird dabei bleiben.
ism
private Nachricht | Beiträge des Benutzers