Dll function aus VB6 heraus aufrufen.

  • VB6

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

    Dll function aus VB6 heraus aufrufen.

    Vorweg: Ich benutze immer noch VB6, da ich hunderte von Programmen in VB6 geschrieben habe (und auch noch benutze). Die alle in .net zu
    konvertieren ist nicht möglich.
    Ich bin ob ich will oder nicht zu VB6 verdammt :(

    Nun meine Problem:

    Ich möchte folgende die Function

    C-Quellcode

    1. void spectrum_r_i(float *wave,float *re,float *im)

    im dll "fftdll.dll" aufrufen.

    Habe früher schon schon öfter functions aus dll's aufgerufen, bin aber etwas eingerostet.
    Nachdem ich im Internet nichts brauchbares gefunden habe, versuche ich es hier.

    Der Test-Code in VB6 sieht folgendermassen aus.

    Visual Basic-Quellcode

    1. Declare Function spectrum_r_i Lib "fftdll.dll" (wave As Single, re As Single, im As Single) As Long
    2. Dim b1(1024) As Single
    3. Dim b2(1024) As Single
    4. Dim b3(1024) As Single
    5. Dim re As Long
    6. re = spectrum_r_i(b1, b2, b3)
    Leider bekomme ich schon für b1 den Fehler: "Argumenttyp ByRef unverträglich"

    Was mache ich falsch???

    CodeTags gesetzt und Thema verschoben ~VaporiZed

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

    Ich glaube, VB6 hat als Standard ByRef und du wirst wohl ByVal benötigen.
    Versuch's mal mit

    Visual Basic-Quellcode

    1. ​Declare Function spectrum_r_i Lib "fftdll.dll" (ByVal wave As Single, ByVal re As Single, ByVal im As Single) As Long
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod Das sind aber Arrays.
    @Protolus Oder probier einer von diesen hier:

    Visual Basic-Quellcode

    1. Declare Function spectrum_r_i Lib "fftdll.dll" (ByVal wave As Single(), ByVal re As Single(), ByVal im As Single()) As Long
    2. ' oder
    3. Declare Function spectrum_r_i Lib "fftdll.dll" (ByRef wave As Single(), ByRef re As Single(), ByRef im As Single()) As Long
    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!
    Kurzer Zwischenruf: void <-> Declare Function … As Long? Nicht vielleicht besser Declare Sub?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Protolus

    Ich würde es so deklarieren und entsprechend aufrufen. Musst mal testen. 1024 für die Arrays dürften nicht richtig sein, wenn dann 1023 (0 To 1023 = 1024 Elemente).

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Declare Sub spectrum_r_i Lib "fftdll.dll" ( _
    3. ByVal wave As Long, _
    4. ByVal re As Long, _
    5. ByVal im As Long)
    6. Private Sub Command1_Click()
    7. Dim b1(1024) As Single
    8. Dim b2(1024) As Single
    9. Dim b3(1024) As Single
    10. Call spectrum_r_i(VarPtr(b1(0)), VarPtr(b2(0)), VarPtr(b3(0)))
    11. End Sub
    Mfg -Franky-
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Genau das war die Lösung.
    Jetzt funzt alles.
    Ich habe sowas schon mal vor langer Zeit programmiert. Hatte aber die Details vergessen. Jetzt ist alles wieder da.
    Danke Dir.

    Du hast ja sicher bemerkt, dass es um Fast Fourier Transformation geht.
    Ich weiss auch, dass die Anzahl der Bin's bei FFT ein vielfaches von 2 sein muss.
    Aber wenn ich die Arrays auf 1023 (0 bis 1023 = 1024) dimensioniere, schmiert VB ab.

    Da habe ich in einem Demo-Programm zu dieser dll folgendes gesehen:

    C-Quellcode

    1. //===================================================
    2. HWND hWnd;
    3. short wave[1025];
    4. float mid[1025],amplitude[1025],phase[1025];
    5. float Fs=5120;
    6. int type=0,fre=50,len=1024;
    7. //===================================================


    Die Arrays müssen tatsächlich 1025 Stellen (0 bis 1024) gross sein.

    Der Aufruf klappt jetzt und die Resultate sind auch plausibel.
    Danke Dir nochmal. Du hast mir sehr geholfen.

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