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. |