C++ DLL in VB.Net einbinden

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    C++ DLL in VB.Net einbinden

    Hallo zusammen,

    ich hab ein Problem beim Einbinden einer C++ DLL in mein Projekt.

    Zuerst mal:
    Ich hab eine C++ DLL mit der ich eine Maschine ansteuern kann (Funktioniert auch soweit mit der vorhanden Anwendung).
    Jetzt muß ich zusätzlich noch eine Schnittstelle über USB einbauen.
    Da wollt ich dann auf VB.net umstellen (die andere Anwendung wurde in einem Uralt C++ gemacht und ich bin etwas auser Übung mit c++)

    Die Beschreibung der DLL (hier nur eine Funktion) lautet wie folgt:
    '******************************************************************************
    '
    ' Function : HPLCOpen
    '
    ' Purpose : Opens the serial port for communication
    '
    ' Parameter : hChannel - handle to the communication channel
    ' tcPort - name of the com-port (eg. COM1)
    ' hRxEvent - handle to an event already registered in exe
    '
    ' Return value : iResult - possible values see header file
    '
    ' Developer:
    '
    '*******************************************************************************
    Declare Function HPLCOpen Lib "HMIPLCSer.dll" Alias "_HPLCOpen@12" (ByRef Handle As Long, _
    ByVal Port As String, _
    ByVal EventHandle As Long) As Long

    Ich hab dann die Declare Function umgeschrieben zu:

    <DllImport("HMIPLCSer.dll", EntryPoint:="_HPLCOpen@12", CallingConvention:=CallingConvention.Cdecl)> _
    Public Function HPLCOpen(ByRef Handle As Long, ByVal Port As String, ByVal EventHandle As Long) As Long

    End Function


    Diese Funktion rufe ich wie folgt auf:

    Public Handle as long

    Public Function OpenSeriell(ByVal sPort As String) As Long
    sPort = "COM3" 'Hier festeingestellter Port; später durch Übergane ersetzen
    Dim EventHandle As Long

    EventHandle = 0

    OpenSeriell = Module1.HPLCOpen(Handle, sPort, EventHandle)
    End Function

    Diese Funktion soll die serielle Schnittstelle initialisieren/öffnen.

    Ich bekomme dann eine Fehlermeldung:
    A call to PInvoke function 'Turntable!WindowsApplication1.Module1::HPLCOpen' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

    Ich weis da jetzt nicht mehr weiter. Hab schon Stundenlang gesucht.
    Hatte was gefunden, daß man "den Sicherheitslevel in .net hoch setzen muß"

    Ich weis jetzt nicht mehr weiter.
    Kann mir jemand helfen.

    Vorab schon mal vielen Dank.
    wenn du long in .Net hast, dann muss es long long in C(++) sein bzw. long long int, denn nur diese sind 64 Bit groß, sowie der Long Datentyp bei .Net...

    Der Fehler kommt zustande, weil eben dies nicht der Fall ist, also brauchst du höchstwahscheinlich nur 4 Byte(32 Bit groß), was einem Integer entspricht verwenden:
    in deinem .Net Code Long->Integer ändern...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    wenn du long in .Net hast, dann muss es long long in C(++) sein bzw. long long int, denn nur diese sind 64 Bit groß, sowie der Long Datentyp bei .Net...

    Der Fehler kommt zustande, weil eben dies nicht der Fall ist, also brauchst du höchstwahscheinlich nur 4 Byte(32 Bit groß), was einem Integer entspricht verwenden:
    in deinem .Net Code Long->Integer ändern...

    Guten Morgen Joob,

    danke für die schnelle Antwort.
    Leider wars das nicht. Wenn ich anstelle von long integer nehme, erhalte ich den gleichen Fehler/Fehlerbeschreibung.
    @Ironic: Sieh Dir mal diesen Thread an, geht auch für 64 Bit, nicht aber für AnyCPU.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Ironic schrieb:

    das Projekt
    die ZIP-Files? Das ist VS 2010.
    Kann es sein, dass die Express-Version die C++-Projekte nicht öffnen kann?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!