Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Safearray an Dll übergeben/zurückgeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.02.2004, 11:19 Uhr
Spontex



Hallo,

ich möchte gerne aus VB ein array an eine C-DLL übergeben dort dann damit arbeiten und ein weiteres array wieder zurückgeben. Da in VB jedem array eine safearray struktur zu grunde liegt muss ich es in C als safearray behandeln (richtig?).
Leider kenne ich mich mit safearrays in C nicht sonderlich aus, würde das was ich gemacht habe (siehe unten) überhaupt funktionieren? Oder gibt es da noch einen anderen weg?
Momentan scheint es nicht zu funktionieren, leider hab ich keine Ahnung wie ich in meiner DLL debuggen kann um das alles mal zu überprüfen! Könnte mir bitte jemand sagen wie ich das am besten anstelle?!

Der Datentyp des input und output arrays in VB ist jeweils Byte. In meiner C-Funktion möchtes ich dann den input in ein float array kopieren um damit arbeiten zu können. Das 'Ergebnis' meiner Funktion liegt dann in einem char array vor was ich dann in das byte-array in VB kopieren möchte. Der equivalente Datentyp zu Byte in VB ist meiner Meinung nach unsigned char in C. Müsste ich dann mein Ergebnis erst noch von char nach unsigend char konvertieren oder kann ich es einfach so in das safearray schreiben.

So sieht (grob) meine Funktion in der DLL aus:

C++:
declspec__ (dllexport) int __stdcall MeineFunktion (LPSAFEARRAY *input_frame, LPSAFEARRAY *output_bytes, int size)
{

    int MAX_NB, nbBytes;
    long int i;
    
    char *output_buffer;
    float *input_buffer;

    /* alloc memory for input */
    input_buffer = new float [size];

    /* copy input safearray to floatarray */
    for(i=0; i<size; i++)
        SafeArrayGetElement(input_frame[i], &i, &input_buffer[i]);

    /* other functions */

    /* delete memory used for input */
    delete input_buffer;

    /* get frame size in bytes */
    MAX_NB = /* other function */

    /* alloc memory for output */
    output_buffer = new char [MAX_NB];

            /* other functions - return char* */

    /* copy to output safearray */
    for(i=0; i<MAX_NB; i++)
        SafeArrayPutElement(output_bytes[i], &i, &output_buffer[i]);

    /* delete memory used for output */
    delete output_buffer;

    return nbBytes;
}



Der aufruf in VB geschieht folgendermaßen, also müssten die zeiger im Funktionskopf der DLL-Funktion dann auf meine arrays in VB zeigen (richtig?):

Visual Basic:
'EineKlasse

Private m_nbBytes As Long
'[...]

Private Declare Function MeineFunktion Lib "irgendeine.dll" (ByRef InputFrame() As Byte, _
            ByRef OutputBytes() As Byte, ByVal ArraySize As Long) As Long

Public Sub Methode(InputArray() As Byte, OutputArray() As Byte)
   m_nbBytes = MeineFunktion(InputArray, OutputArray, UBound(InputArray))
End Sub
'[...]




Visual Basic:
Dim clsKlasse As New EineKlasse

Dim InputArray() As Byte
Dim OutputArray() As Byte

'Funktionsaufruf
clsKlasse.Methode InputArray, OutputArray



Danke und gruss
Sören

Dieser Post wurde am 18.02.2004 um 11:24 Uhr von Spontex editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: