Array VB -> C++ Dll



  • Hallo,

    ich rufe mit VB eine selbsgeschriebene C++ Funktion in einer Dll auf und übergebe ihr ein Array. Dieses Array ist eine Struktur, die auch ein Array beinhaltet.

    Die Struktur sieht vereinfacht so aus:

    Private Type Daten
      Zahl As Long
      Wert() As Werte
    End Type
    
    Private Type Werte
      Datum As String
      Wert As Single
    End Type
    

    Der Aufruf der Funktion sieht so aus

    Dim aDaten() As Daten
    Dim i As Integer
    
    ReDim aDaten(0)
    aDaten(0).Zahl = 1
    ReDim aDaten(0).Wert(0)
    
    Hole_Daten(aDaten)
    
    For i = 0 To UBound(aDaten(0).Wert)
     Text1.Text = Text1.Text & aDaten(0).Wert(i).Datum & vbCrLf
    Next i
    

    So nun kommt der C++ Teil.
    Um das Array zu übergeben, wird ein SafeArray verwendet:

    int __stdcall Hole_Daten(LPSAFEARRAY FAR *aDaten)
    {                       
     	long 				Indices[] = {1};
    	Daten			DatenLocal;
    	char			Datum[11] = "";
    	long nIndexDate = 0;
    
    		aDaten.Wert = new Werte[2];
    
    		rgIndices[0] = 0;
    		strcpy(Datum, "14.06.2006");
    
    		// BAsic String erstellen
    		char cUNIBufDatum[40] = "";
    		int nLen = MultiByteToWideChar(CP_ACP, 0, Datum, -1, NULL, 0);
    		MultiByteToWideChar(CP_ACP, 0,(char*) &Datum, -1, (OLECHAR*) &cUNIBufDatum, nLen);  
    		DatenLocal.Wert[0].Datum = SysAllocString( (BSTR) cUNIBufDatum);
    
    		DatenLocal.Werte[0].Wert = 1;
    
    		int nLen = MultiByteToWideChar(CP_ACP, 0, Datum, -1, NULL, 0);
    		MultiByteToWideChar(CP_ACP, 0,(char*) &Datum, -1, (OLECHAR*) &cUNIBufDatum, nLen);  
    		DatenLocal.Wert[1].Datum = SysAllocString( (BSTR) cUNIBufDatum);
    
    		DatenLocal.Werte[1].Wert = 2;
    
    		SafeArrayPutElement(*aDaten, rgIndices, &DatenLocal);
    

    Wenn ich die Dll debugge, scheint alles zu Funktionieren ohne Fehler,
    In VB wird die Funktion ohne Probleme aufgerufen, wenn ich mir den Wert im Array mir anzeigen will, sagt er "Index außerhalb des gültigen Bereichs".

    Mache ich irgentwas Falsch?
    Wie muss ich die Werte in C++ dem Array übergeben?

    Danke für eure Antworten



  • Kenn mich in VB nicht aus, aber hast du dafür gesorgt, dass genügend Speicher im VB reserviert wird? Wenn sich die DLL-Funktion beendet wird AFAIK auch der von ihr genutzte Speicher ungültig.



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten