Hallo,
neben anderen Tätigkeiten, betreue ich seit einigen Jahren ein recht umfangreiches VB6 Projekt. Das ist auch der Grund warum es immer noch unter VB6 läuft. Bisher war ich immer nach Recherchen zurecht gekommen, wenn ich von alleine nicht weiter kam. Zu diesem Thema finde ich jedoch nicht ausreichend Informationen.
Ich versuche seit Tagen heraus zu finden wie ich eine C dll einbinden bzw. deren Hauptfunktion mit Void Pointern aufrufen muss. Bisher stürzt bei jedem versuch die IDE ab sobald der Aufruf erfolgt. Testweise habe ich das ganze auch schon in VBA mit dem gleichen Ergebnis probiert. Excel stürzt ebenfalls ab. Die Hauptfunktion hat einige Void Pointer die auf Parameter Arrays zeigen als Ein- und Ausgabe. Die meisten Parameter sind als Double definiert. einzelne Pointer zeigen auf char Parameter.
Neben der Hauptfunktion enthält die dll ein paar deutlich vereinfachte Testfunktionen die ich problemlos aufgerufen bekomme auch wenn ggf. die Syntax nicht perfekt ist. Die Testfunktionen haben jedoch keine Parameter auf die die Pointer zeigen wie es die Hauptfunktion tut. Diese Pointer laufen direkt in Rückgabewerte. Ich vermute das an meinem Aufruf bzw. der Deklaration immer noch etwas nicht in Ordnung ist. Leider habe ich bisher keine eindeutigen Informationen gefunden, wie mit Void Pointern unter VB6 richtig umzugehen ist. Manche sprechen über
Dies ist der dll Header:
Dies ist ein Auszug aus der Variablen Referenz dieser DLL.
Dies ist was ich zuletzt in VB /VBA versucht habe
Grüße
EPM
neben anderen Tätigkeiten, betreue ich seit einigen Jahren ein recht umfangreiches VB6 Projekt. Das ist auch der Grund warum es immer noch unter VB6 läuft. Bisher war ich immer nach Recherchen zurecht gekommen, wenn ich von alleine nicht weiter kam. Zu diesem Thema finde ich jedoch nicht ausreichend Informationen.
Ich versuche seit Tagen heraus zu finden wie ich eine C dll einbinden bzw. deren Hauptfunktion mit Void Pointern aufrufen muss. Bisher stürzt bei jedem versuch die IDE ab sobald der Aufruf erfolgt. Testweise habe ich das ganze auch schon in VBA mit dem gleichen Ergebnis probiert. Excel stürzt ebenfalls ab. Die Hauptfunktion hat einige Void Pointer die auf Parameter Arrays zeigen als Ein- und Ausgabe. Die meisten Parameter sind als Double definiert. einzelne Pointer zeigen auf char Parameter.
Neben der Hauptfunktion enthält die dll ein paar deutlich vereinfachte Testfunktionen die ich problemlos aufgerufen bekomme auch wenn ggf. die Syntax nicht perfekt ist. Die Testfunktionen haben jedoch keine Parameter auf die die Pointer zeigen wie es die Hauptfunktion tut. Diese Pointer laufen direkt in Rückgabewerte. Ich vermute das an meinem Aufruf bzw. der Deklaration immer noch etwas nicht in Ordnung ist. Leider habe ich bisher keine eindeutigen Informationen gefunden, wie mit Void Pointern unter VB6 richtig umzugehen ist. Manche sprechen über
ByRef Pointer as Any
in der Deklaration andere sagen es geht so wie ich es habe. Andere sprechen über InPtr bzw. InStr. Wobei mir auch hier der Einsatz nicht eindeutig klar geworden ist. Beides habe ich schon in verschieden Variationen getestet bin damit aber auch nicht weiter gekommen. Ich würde mir wünschen wenn mir jemand aufzeigen kann wie man die die Deklaration und den Aufruf von Funktionen mit Void Pointern in VB6 richtig macht. Dies ist der dll Header:
C-Quellcode
- #ifndef _FUNC1_H
- #define _FUNC1_H
- #define GROUP_SIZE 512
- #ifndef UNIT_TEST
- #ifdef EXPORT_FCNS
- #define EXPORTED_FUNCTION __declspec(dllexport)
- #else
- #define EXPORTED_FUNCTION __declspec(dllimport)
- #endif
- #else
- #define EXPORTED_FUNCTION
- #endif
- /**
- * The DLL can operate in a variety of "modes" and on the basis of the input parameters it
- * creates a output file. The input/output parameters are arrays of void pointers.
- */
- EXPORTED_FUNCTION int _stdcall test1(void);
- EXPORTED_FUNCTION int _stdcall test2(char in);
- EXPORTED_FUNCTION int _stdcall test3(void *in);
- EXPORTED_FUNCTION int _stdcall test4(void *in, void *out);
- EXPORTED_FUNCTION int _stdcall mainF(unsigned char mode,
- void * group_in_1,
- void * group_in_2,
- void * group_in_3,
- void * group_in_4,
- void * group_in_5,
- void * group_in_6,
- void * group_in_7,
- void * group_in_8,
- void * group_in_9,
- void * group_in_10,
- void * group_in_11,
- void * group_in_12,
- void * group_in_13,
- void * group_in_14,
- void * group_in_15,
- void * group_in_16,
- void * group_out_1,
- void * group_out_2,
- void * group_out_3,
- void * group_out_4,
- void * group_out_5,
- void * group_out_6);
- #endif
Dies ist ein Auszug aus der Variablen Referenz dieser DLL.
Dies ist was ich zuletzt in VB /VBA versucht habe
Visual Basic-Quellcode
- Option Explicit
- Private Declare Function mainF Lib "c:\temp\dmls.dll" (ByVal Mode As Byte, _
- ByRef GI1 As Double, ByRef GI2 As Double, _
- ByRef GI3 As Double, ByRef GI4 As Double, _
- ByRef GI5 As Double, ByRef GI6 As Double, _
- ByRef GI7 As Double, ByRef GI8 As Double, _
- ByRef GI9 As Double, ByRef GI10 As Double, _
- ByRef GI11 As Byte, ByRef GI12 As Byte, _
- ByRef GI13 As Double, ByRef GI14 As Double, _
- ByRef GI15 As Double, ByRef GI16 As Double, _
- ByRef GO1 As Double, ByRef GO2 As Double, _
- ByRef GO3 As Byte, ByRef GO4 As Double, _
- ByRef GO5 As Double, ByRef GO6 As Double) As Long
- Private Sub CallDLL()
- Dim Success As Long ' VB Long is equal to C Integer32
- Dim C_Mode As Byte
- Dim GroupI1(511) As Double 'Arrays for pointers
- Dim GroupI2(511) As Double
- Dim GroupI3(511) As Double
- Dim GroupI4(511) As Double
- Dim GroupI5(511) As Double
- Dim GroupI6(511) As Double
- Dim GroupI7(511) As Double
- Dim GroupI8(511) As Double
- Dim GroupI9(511) As Double
- Dim GroupI10(511) As Double
- Dim GroupI11(127) As Byte 'Data In ist 128 Bytes groß, mit 511 auch schon probiert
- Dim GroupI12(6) As Byte 'mein Pfad hat nur 7 Zeichen, mit 511 auch schon probiert
- Dim GroupI13(511) As Double
- Dim GroupI14(511) As Double
- Dim GroupI15(511) As Double
- Dim GroupI16(511) As Double
- Dim GroupO1(511) As Double
- Dim GroupO2(511) As Double
- Dim GroupO3(127) As Byte
- Dim GroupO4(511) As Double
- Dim GroupO5(511) As Double
- Dim GroupO6(511) As Double
- Dim i As Integer 'count variable
- On Error GoTo error
- C_Mode = 1
- For i = 0 To 511
- GroupI1(i) = i
- GroupI2(i) = i
- GroupI3(i) = i
- GroupI4(i) = i
- GroupI5(i) = i
- GroupI6(i) = i
- GroupI7(i) = i
- GroupI8(i) = i
- GroupI9(i) = i
- GroupI10(i) = i
- GroupI13(i) = i
- GroupI14(i) = i
- GroupI15(i) = i
- GroupI16(i) = i
- Next
- GroupI12(0) = 99 'c ASCII Path
- GroupI12(1) = 58 ':
- GroupI12(2) = 92 '\
- GroupI12(3) = 116 't
- GroupI12(4) = 101 'e
- GroupI12(5) = 109 'm
- GroupI12(6) = 112 'p
- For i = 0 To 126 'Data In
- GroupI11(i) = 0
- Next
- GroupI11(127) = 255
- Success = mainF(C_Mode, _
- GroupI1(0), GroupI2(0), _
- GroupI3(0), GroupI4(0), _
- GroupI5(0), GroupI6(0), _
- GroupI7(0), GroupI8(0), _
- GroupI9(0), GroupI10(0), _
- GroupI11(0), GroupI12(0), _
- GroupI13(0), GroupI14(0), _
- GroupI15(0), GroupI16(0), _
- GroupO1(0), GroupO2(0), _
- GroupO3(0), GroupO4(0), _
- GroupO5(0), GroupO6(0))
- MsgBox (Success)
- Exit Sub
- error: MsgBox (Err.Number & " " & Err.Description)
- Resume Next
- End Sub
Grüße
EPM
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EPM“ ()