typedef void*

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    typedef void*

    Hallo na Alle!

    Ich habe mich im Forum bereits umgesehen und auch Google gebraucht, doch leider komme ich nicht an die Lösung für mein Problem.
    Vorab: Ich programmiere bevorzugt mit VB.net und stelle mich sehr dumm an wenn es darum geht, gewisse Stellen aus C/C++ ins VB.net zu übersetzen.
    Zurzeit programmiere ich eine Anwendung, die einen Heidenhaintaster ansteuern soll. Seit einiger Zeit ist es auch wichtig, dass meine Anwendung einige Parameter an die CNC-Steuerung übergibt.
    Das Programm, dass für die Steuerung verantwortlich ist, wurde in C geschrieben.
    Nun habe ich ein Haufen "Header"-Dateien und müsste so was übersetzen:

    C-Quellcode

    1. BOOL DLLENTRYDECLARATION A3200VariableGetGlobalDouble(A3200Handle handle, DWORD variableNumber, DOUBLE *valueOut)


    Was bei mir dann so aussah:

    VB.NET-Quellcode

    1. <DllImport(Nom)>
    2. Public Shared Function A3200VariableGetGlobalDouble(ByVal handle As A3200Handle, ByVal variableNumber As Integer, ByRef valueOut As Double) As Boolean
    3. End Function


    Nun scheints noch ein Problem mit "A3200Handle" zu haben.
    Ich habe dann sogleich alle Header durchsucht und folgendes gefunden:

    C-Quellcode

    1. typedef void* A3200Handle;


    Suche mit gegebenen Schlagwörtern (typedef; void; void*) führten, nach verschiedenen Foren und Problemstellungen, zu diesem Ergebnis:

    VB.NET-Quellcode

    1. Public Function A3200H(ByVal A3200Handle As IntPtr) As Integer
    2. Return vbNull
    3. End Function


    ^^ Bevor nun das Gelächter anfängt: vbNull sollte eine Art "Void" werden.
    Habe ich noch etwas vergessen? Oder gehe ich die ganze Sache komplett verkehrt an?


    Gruss

    Hutti

    Hutti schrieb:

    Oder gehe ich die ganze Sache komplett verkehrt an?
    Möglicherweise.
    Übersetzen bringt da gar nix, das musst Du übertragen und auf der DLL- sowie der VB-Seite entsprechend formulieren.
    Gugst Du hier, da hast Du eine Reihe von Beispielen, wie Daten zwischen .NET und nativem C / C++ übertragen werden.
    Hast Du die kompletten C / C++-Quellen in der Hand?
    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!

    RodFromGermany schrieb:

    Hast Du die kompletten C / C++-Quellen in der Hand?


    Ja scheint alles da zu sein. Leider kommt mir ein C-Projekt oft sehr ungeordnet vor (im Vergleich zu VB.net)

    AliveDevil schrieb:

    Also statt deinem A3200-Handle nimmste n IntPtr.


    Jo. Das habe ich auch schon gelesen und deswegen auch

    VB.NET-Quellcode

    1. as IntPtr
    in der Function eingebaut. Ist das falsch?

    VB.NET-Quellcode

    1. <DllImport(Nom)>
    2. Public Shared Function A3200VariableGetGlobalDouble(ByVal handle As IntPtr, ByVal variableNumber As Integer, ByRef valueOut As Double) As Boolean
    3. End Function


    Vermutlich wenn du das Handle nicht irgendwo her bekommst probiere IntPtr.Zero zu übergeben.
    Quelle: msdn.microsoft.com/de-de/libra…ntptr.zero(v=vs.110).aspx : Ein schreibgeschütztes Feld, das einen mit 0 (null) initialisierten Zeiger oder ein Handle darstellt.


    So wie ich das verstehe, stellt es eine Art Ersatz für das "void" dar.
    Ich habe es gerade geändert, die Fehlermeldung (dass es nicht deklariert sei) bleibt aus. Leider komme ich fürs erste nicht zum Versuchen, da die Maschine zurzeit einen Auftrag abschliesst.
    Schreibe sobald möglich!
    Bisweilen: Danke an die helfenden User :)

    Hutti schrieb:

    in der Function eingebaut
    Du musst die richtige Deklaration generieren, dann musst Du die Parameter der Deklaration entsprechend generieren.
    Dazu findest Du einiges im Link von oben.
    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!
    * sind Pointer in C/C++ also Adressen. void bezeichnet einfach keinen Datentyp, so wie in C# auch:

    Quellcode

    1. void funktionsname();
    ist wie in VB eine Sub, d.h. es wird kein Datentyp zurückgegeben
    void* ist hingegen eine Adresse auf eine Speicherstelle, welche theoretisch beliebige Daten an der Stelle im Speicher haben kann, wie die Daten zu interpretieren sind muss dann C verstehen.
    Jedoch frage ich mich ob void* im C code wirklich nötig wäre, oder ob da jemand nur zu Faul war es richtig zu machen.

    Zusätzlich stellt sich mir natürlich die Frage, ist denn das Wrappen des C Codes nötig, oder kann man vlt. nicht sogar den kompletten C Code in VB übersetzen, sodass du diese Anbindung gar nicht mehr brauchst(anscheinend hast du ja den SourceCode?)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---