Verwendung C-Deklaration (DLL) in VB

  • VB6

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

    Verwendung C-Deklaration (DLL) in VB

    Hallo,

    ich möchte gern eine Funktion aus einer fremden DLL verwenden, für die ich aber nur eine Deklaration für C/C++ habe.

    extern long WINAPI GetPlantIdName(long Ref, char *Str);

    Wie müßte ich den Pointer auf den String in VB6 deklarieren?
    (Ich habe derzeit nicht die Recourcen, das ganze Programm nach VB.Net zu portieren, muss also erstmal in VB6 bleiben)

    meine Versuche mit
    (ByVal Ref&, ByRef b() As Byte) => Programm stürzt ab
    (ByVal Ref&, ByRef s As String) => Programm verändert den übergebenen String nicht (wenn leer hin, dann auch leer zurück, wenn vorbelegt hin, dann mit gleichem Wert zurück)
    funktionieren jedenfalls nicht

    Vielen Dank für eure Hilfe
    An den Rückgabewert in deiner Declare-Anweisung hast du aber gedacht, oder? Also As Long am Ende. Ich kenne mich mit C nicht aus, aber da steht char und du schreibst b() As Byte. Warum ein Array?

    Hier gibt's eine gute Hilfe zu C-DLLs in VB6: learn.microsoft.com/en-us/prev…-basic-6/aa261278(v=vs.60)
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hi, bin mir nicht genau sicher, aber es wird ein array von chars bzw ein Pointer zu dem array als 2 parameter benötigt. Glaube wenn das reines C ist, kann es sein, dass es einfach den DatenTypen String nicht kennt. Eventuell hilft das weiter stackoverflow.com/questions/38…tring-and-char-str-string
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Andy“ ()

    Vielleicht Blödsinn, aber muss man Pointer evtl. als IntPtr deklarieren?

    Andy schrieb:

    es wird ein array von chars

    Aber müsste dann dort nicht sowas wie char[] *Str stehen?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @MisterCP long Ref ist unter C++ ein int32.
    Wahrscheinlich ein Handle der DLL-Instahz.
    Compiliere Dein Programm als x86, wenn es unter VB6 einen Schalter für x86<=>x64 gibt.
    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!
    Hi

    Aus welcher DLL stammt diese Funktion? Woher kommt die Info zu dieser Funktion? Gibt es ein Headerfile zu der DLL bzw. eine Beschreibung zur Funktion bzw. zu dessen Parameter? Evtl. ist der letzte Parameter ByRef Str As Long. Nach dem Aufruf ist dann evtl. im Long ein Pointer auf ein String.

    @RodFromGermany VB6 kann nur x86.
    Mfg -Franky-

    Marcus Gräfe schrieb:

    Aber müsste dann dort nicht sowas wie char[] *Str stehen?


    naja ein einzelnes Zeichen macht ja kein sinn :) der * bedeutet das ein Pointer verlangt wird. Laut dem Stackoverflow post ist selbst mit char *str ein pointer zu einem char array
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Hi

    Wenn man der von @Andy gemachten Aussage folgt, dann müsste man vorher Wissen, wie groß das Array sein muss. Evtl. muss die entsprechende Funktion zweimal aufgerufen werden. Vermutlich gibt der erste Aufruf mit beiden Parametern = 0& im Return die Größe für das zu dimensionierende Array zurück. Entsprechend das Array dimensionieren. Beim zweiten Aufruf könnte der erste Parameter die Größe des Arrays und der zweite Parameter ein Pointer auf das erste Element des Arrays sein. Wenn dem so ist, dann würde ich beide Parameter mit ByVal xyz As Long auslegen und den zweiten Parameter mit VarPtr(Array(0)) füttern.

    Besser wäre natürlich eine Beschreibung der Funktion wo man das genau heraus lesen könnte.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()