2016-04-02 3 views
0

anrufe habe ich ein Legacy-Projekt wurde vor vielen Jahren geschrieben, die mit VB 6 geschrieben. Ich kann nicht genug Informationen von VB 6 auf Google finden, weil VB 6 zu alt ist .Was ich falsch gemacht habe, dass ich eine DLL von VB6

Ich versuche, eine DLL von VB 6, die in VC++ geschrieben ist, aufzurufen. Das Problem ist, wenn VB die DLL aufgerufen hat, wurde VB abgestürzt. Ich dachte, es wären die Fehler von DLL, dann debugge ich die DLL. Allerdings habe ich festgestellt, dass die DLL funktioniert gut. Es gibt schließlich 0 zurück, aber die VB-Pass das Doppel-Array ist nicht erfolgreich, aber die DLL funktioniert OK.und dann, wenn DLL fertig beendet und zurück zu VB, VB dann abgestürzt sein. Ich kann nicht herausfinden, was passiert ist. Irgendeine Idee?

Hier ist mein VB-Code

Declare Function parseexcel Lib "parseexcelct.dll" (ByVal thepath As String, ByRef total() As Double, ByRef xy() As Double, ByRef ylxx() As Double, ByRef zy() As Double, ByRef zcy() As Double, ByRef gj1 As Double, ByRef gj2 As Double, ByRef xs1 As Double, ByRef xs2 As Double, ByVal gjt1 As Double, ByVal gjt2 As Double, ByVal xst1 As Double, ByVal xst2 As Double) As Long 


Dim mypathstr As String 

Dim total(0 To 20) As Double 

Dim xy(0 To 20) As Double 
Dim ylxx(0 To 20) As Double 
Dim zy(0 To 20) As Double 
Dim zcy(0 To 20) As Double 

Dim gj1 As Double, gj2 As Double, xs1 As Double, xs2 As Double, gjt1 As Double 
Dim gjt2 As Double, xst1 As Double, xst2 As Double 
Dim result As Integer 

mypathstr = CommonDialog.FileName 
Dim i As Integer 

    'try to initial the array 
    For i = 0 To 20 
    total(i) = 1.1 
    xy(i) = 1.1 
    ylxx(i) = 1.1 
    zy(i) = 1.1 
    zcy(i) = 1.1 
    Next i 

    result = 0 
    gj1 = 1.1 
    gj2 = 1.1 
    xs1 = 1.1 
    xs2 = 1.1 
    gjt1 = 1.1 
    gjt2 = 1.1 
    xst1 = 1.1 
    xst2 = 1.1 

    result = parseexcel(mypathstr, total(), xy(), ylxx(), zy(), zcy(), gj1, gj2, xs1, xs2, gjt1, gjt2, xst1, xst2)'program have crashed here 

DLL-Funktion ist

int __stdcall parseexcel(const char * thepath,double * total,double * xy,double * ylxx,double * zy,double * zcy,double & gj1,double & gj2,double & xs1,double & xs2,double gjt1,double gjt2,double xst1,double xst2 ) 

Was ich falsch gemacht habe?

Antwort

1

C++ verwendet ziemlich "dumme" Arrays und verwendet SAFEARRAY auf keinen Fall standardmäßig. Sie können also nicht einfach einen Zeiger auf ein SAFEARRAY übergeben, sondern stattdessen einen Zeiger auf das BLOB der Daten.

In VB6 wird dies oft einfach, indem man einen Zeiger auf den Anfang der Daten des Array erreicht, indem ByRef das erste Array-Element übergeben:

Declare Function parseexcel Lib "parseexcelct.dll" (_ 
    ByVal thepath As String, _ 
    ByRef total As Double, _ 
    ByRef xy As Double, _ 
    ByRef ylxx As Double, _ 
    ByRef zy As Double, _ 
    ByRef zcy As Double, _ 
    ByRef gj1 As Double, _ 
    ByRef gj2 As Double, _ 
    ByRef xs1 As Double, _ 
    ByRef xs2 As Double, _ 
    ByVal gjt1 As Double, _ 
    ByVal gjt2 As Double, _ 
    ByVal xst1 As Double, _ 
    ByVal xst2 As Double) As Long 

result = parseexcel(mypathstr, _ 
        total(0), _ 
        xy(0), _ 
        ylxx(0), _ 
        zy(0), _ 
        zcy(0), _ 
        gj1, _ 
        gj2, _ 
        xs1, _ 
        xs2, _ 
        gjt1, _ 
        gjt2, _ 
        xst1, _ 
        xst2) 

Dergleichen ziemlich gut in der VB6 Dokumentation abgedeckt ist.

+0

[Hier] (https://msdn.microsoft.com/en-us/library/aa338032 (v = VS.60) .aspx) ist die (gut versteckte) Verbindung zur VB6-Referenzbibliothek von MSDN. Wie Sie gesehen haben, hat Microsoft alles getan, um die VB6-Dokumentation schwer zu finden. – BobRodes

Verwandte Themen