Wie verwende ich eine Vb DLL in einem anderem Projekt ohne Import?

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von powachill.

    Wie verwende ich eine Vb DLL in einem anderem Projekt ohne Import?

    Hallöle..
    Wie bereits erwähnt:
    Ich möchte eine von mir erstellte DLL (vb.net) in einem anderem Projekt (bestmöglich C++) verwenden.
    Wobei die Struktur der Funktion hier eine große rolle spielt, denn ich kenne mich noch nicht wirklich
    damit aus.
    Also.
    Ich habe bereits schon was von "DllImport" gehört und so, aber wie genau funktioniert das? :)
    Wenn mir das einer erklären kann und dann freundlicher Weise meinen (kleinen) Code für C++ verwendbar
    machen kann, gibts nicht nur ein großeß Lob, sondern auch einen Klick auf's Thanks button :)

    Mein Code (optional):

    VB.NET-Quellcode

    1. Public Function HandleMessage(ByVal msg As Object, ByVal player As Object)
    2. 'msg.msgtype etc..
    3. 'if blabla..
    4. 'player.do_something(stuff_here)
    5. 'end if
    6. End Function


    Soweit so gut, so sieht die DLL aus.
    Doch wie mache ich das mit DLL Import?
    Also ich meine, wie sieht das in C++ aus? (-> "<DLLImport> Blabla Function Lib Blabla (Blabla Argumente Blabla)") <- will ich in C++ wenn's geht :)


    Danke!
    Gratz,
    BeefyX
    Hi.

    Nativer (unverwalteter) Code kann nicht direkt auf verwaltete DLLs zugreifen - er braucht die Hilfe des COM-Subsystems. Mit verwaltetem Code wirds etwas einfacher.

    Für unverwalteten Code lies: support.microsoft.com/kb/828736
    Für verwalteten Code kannst du die Reflexion des Frameworks nutzen: msdn.microsoft.com/de-de/library/b61s44e8%28v=VS.80%29.aspx. Erstelle danach benötigte Klasseninstanzen über den Activator. Denke daran, dass ohne Verweise (=Metadatenimport) nur späte Bindung möglich ist. Dabei könne jede Menge Fehler entstehen, die nicht auf den ersten Blick erkennbar sind.

    Klick auf's Thanks button

    Schade, dass mir das ziemlich egal ist... Copy&Paste-Code gibts trotz des tollen Angebots nicht. :P
    Gruß
    hal2000
    Gut, danke. ^^
    Doch noch habe ich nicht ganz verstanden..
    Habe nach etwas weiterem suchen folgendes gefunden:

    Quellcode

    1. __declspec(dllimport) void func1(void);


    Könnte mir einer ein wenig erklären, wofür was steht?
    Ich meine, wofür steht da das "void" in der Argumentklammer von func1?
    Ich versteh das nicht :(
    Ich versuch' ja C++ zu lernen, aber bis dahin will ich in Teeworlds die Textnachrichten über eine Visual Basic . NET dll steuern.
    Also ich meine, beim Spiel Teeworlds gibt es bei der hooks.cpp ja den Teil, wo der Text gesendet wird.
    Da würde ich ja so machen, dass ich die DLL "importiere" und dann die Funktion "handlemessage" aufrufe.
    Das sieht dann ja so aus:

    if(handlemessage(msg, p) == false) {
    game.send_chat(GAMECONTEXT::ALL, msg->message)
    }

    So.
    Zum beispiel sähe die Funktion so aus:

    Function handlemessage(ByVal msg As Object, ByVal p As Object)
    If msg.message = "/die"
    p.die()
    Return True
    End If
    Return False
    End Function


    Die Funktion überprüft, ob die Text nachricht "/die" ist und tötet dann den Spieler.
    Ich nehme an, die Funktion müsste in ein Modul ? (bsp: Modul1) oder ?

    Kann mir jemand helfen? :(

    powachill schrieb:

    wofür steht da das "void" in der Argumentklammer

    Das steht für "func1 hat keine Parameter".

    Da du offensichtlich noch nicht ganz so weit bist, solltest du mit etwas einfachem anfangen. Externe Aufrufe an DLLs einer anderen Plattform gehören definitiv nicht dazu. Wie wärs mit einem Taschenrechner auf der Konsole? Du kannst dich natürlich auch in Bücher vertiefen.

    Momentan ist mir nicht ganz klar, was genau du machen willst - du schreibst hier ein wenig C++, dort ein wenig VB. Außerdem sollen irgendwelche Aufrufe stattfinden und eigentlich willst du ein Spiel steuern. Oder willst du Code von C++ nach VB übersetzen (oder umgekehrt?). Präzisiere doch bitte nochmal dein Problem. Ich denke du weißt, dass Fragen wie "erklär mir mal C++ weil ich das lernen will" eher unangebracht sind...
    Gruß
    hal2000
    Also wenn du schon C++ programmierst würde ich dir auch raten die Funktionen die du anscheint in deine VB Dll implementiert hast in C++ zu schreiben, ist sicher deutlich einfacherer als die Dll dort vernünftig einzubinden.
    Andersrum wäre es schon einfacherer, also C++ Dlls in VB über API Deklaration einzubinden.
    Hmm.. Danke für eine hilfreichen Posts.
    Ich werde mich jetzt erstmal daran versuchen, einen kleinen Taschenrechner in C++ zu schreiben.
    Wobei ich doch schon nahezu vollständig mit der Teeworlds Source (C++) umgehen kann.
    Ich werde mich noch daran versuchen, einen Taschenrechner hinzubekommen und ich werde auch vom Code Designer lernen,
    sobald er mir ein Fehler sagt und etwas vorschlägt.

    Wobei ich doch erfolglos bin, könnte ich einen Code von euch trotzdem gebrauchen.
    Also, in Visual Basic binde ich eine DLL so ein:

    VB.NET-Quellcode

    1. <DllImport("connectcodefont.dll")> _
    2. Public Shared Function Encode_Codabar(ByVal instr As String, ByVal checkdigit As Integer, ByVal outstr As System.Text.StringBuilder, ByVal outstrmax As Integer) As Integer

    (Nur ein Beispiel!)

    Und wie sähe das mit den Parametern und so weiter aus?
    Also ich fände da keinen Ansatz, das in C++ umzuschreiben :)
    Doch sinnvoll wird es auch immer sein, C++ und .NET zu beherschen.



    Danke für eure Posts!
    Gratz,
    BeefyX
    @Tsuyo, den Link habe ich ja gesehen,
    aber ich glaube ich muss mich dumm stellen :(
    Soweit ich das verstanden habe ist das auf der
    Seite da alles für Vb.Net und nicht für C++ oder?
    Tut mir leid, wenn ich euch so durchstocher^^ Aber ich brauche Hilfe :D
    Hmm..
    Ich bin jetzt mal so weit, dass ich schon da hier habe:

    Quellcode

    1. #if BUILDING_DLL
    2. # define DLLIMPORT __declspec (dllexport)
    3. #else /* Not BUILDING_DLL */
    4. # define DLLIMPORT __declspec (dllimport)
    5. #endif /* Not BUILDING_DLL */
    6. typedef int (*handlemsg)(msg, player, game); //Wobei hier ein Fehler ist: Ich weiß leider nicht, was Object (visual basic) in C++ ist :S


    Und weiter unten...

    Quellcode

    1. //.......
    2. p->last_chat = time_get();
    3. HINSTANCE hDLL = LoadLibrary("TeeLib.dll");
    4. if(hDLL == NULL) {
    5. dbg_msg("TeeLib", "Could not load TeeLib.dll");
    6. } else {
    7. handlemsg hmg = (handlemsg) GetProcAddress(hDLL, "handle_message");
    8. hmg(msg, p, game);
    9. }
    10. if(msg->message[0] == '/') {
    11. //.......



    Nun, und weiter entfernt, sagt mir der Compiler das hier:
    Windef.h(342) : error C2371: 'POINT': Neudefinition; unterschiedliche Basistypen
    ..pfad..\game\maptems.hpp(61): Siehe Deklaration von 'POINT'

    Ah bitte helft mir :(
    Ich glaube ich habe verstanden, was du willst.

    - Du hast eine DLL, die unverwalteten Code enthält.
    - Du hast VB-Code, der diese DLL verwendet (mit DllImport).
    - Du möchtest den Code in C++ umschreiben, also Funktionen dieser DLL in einem C++-Programm verwenden.

    Liege ich da richtig? Wenn ja, lies diesen Artikel: de.wikipedia.org/wiki/Dynamic_Link_Library. Dort gibts auch ein Beispiel.
    Gruß
    hal2000
    Nah, fast richtig :D
    Nur eine sache ist anders :

    "- Du hast VB-Code, der diese DLL verwendet (mit DllImport)."

    Stimmt nicht xD
    Ich habe ein C++ Code und will die VB.Net dll dort benutzen.
    Info: Der Source code wird bei teeworlds mit BAM compiliert und nicht mit visual studio ;D

    Hilfe? :)
    Mist, ich versteh das mit dem CLR nicht :(
    Das verwirrt mich alles.
    Irendwas mit CLI (Client Language Interface or what the fuck?!?!?!)
    oder CLR vielleicht Common Language Runtime? das CL kann beim CLI auch so sein wie hier, aber egaaal.
    Hauptsache: Ich versucht erstmal C++ zu lernen, bevor ich dumme fragen stelle :)
    -> #Closerequest :)