2016-04-02 16 views
0

VB 6 ile yazılmış uzun yıllar önce yazılmış bir eski projem var. VB 6 nedeniyle Google'da VB 6 ile ilgili yeterli bilgiyi bulamıyorum. .VB6'dan bir dll çağırdığımda yanlış yaptım

VC++ 'da yazılan VB 6'dan bir DLL dosyasını aramaya çalışıyorum. Sorun, VB'nin dll'yi çağırması, VB'nin çökmesidir. DLL hataları olduğunu düşündüm, sonra DLL hata ayıklayın. Ancak, dll iyi çalışıyor bulduk. Sonunda 0 döndürür, ancak VB çift dizi başarılı değil, ancak DLL, Tamam çalışır ve sonra dll exectued bittiğinde ve VB'ye geri döndüğünde, VB sonra çöktü. Ne olduğunu anlayamıyorum. Herhangi bir fikir? İşte

benim VB kodu

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 işlevi yanlış ne yaptım

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 ) 

mı?

cevap

1

C++, oldukça "dilsiz" diziler kullanır ve her durumda varsayılan olarak SAFEARRAY kullanılmaz. Yani bir SAFEARRAY'a bir işaretçiyi gösteremezsiniz, bunun yerine verilerin BLOB'una bir işaretçi ister.

VB6 bu genellikle ByRef ilk dizi öğe ileterek dizinin verilerinin başlangıcına bir işaretçi geçirerek basitçe gerçekleştirilir:

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) 

Bu tür şeyler oldukça iyi VB6 belgelerinde kaplıdır.

+0

[Burada] (https://msdn.microsoft.com/en-us/library/aa338032 (v = VS.60) .aspx) MSDN'nin VB6 başvuru kitaplığına (iyi gizlenmiş) bağlantıdır. Gördüğünüz gibi, Microsoft, VB6 belgelerini bulmak zorlaştırmak için kendi yolunu bıraktı. – BobRodes