C++ dll in VB.Net einbinden


Keyjunkie

Grünschnabel
Hi,

ich wollte folgende C++ dll in ein Vb.net Tool einbinden, bekomme aber keine gültige Antwort.

Note: the callback-function must look like this:
//
// void __stdcall YourCallBack(BYTE *Buff, int len) // or __fastcall if you need it
// {
// do your stuff here...;
// }
//
// when this function is called then there are len bytes at Buff
//
// Return value: true = filter & socket successfully set, and lpFunc will be called on data arrival
// false = either filter or socket could not be created
//
// Example: SetFilter(17,&YourCallBack,2,2,&filter_num); the "&" is important, if you don't write it, it'll make you mad!
// Sets a filter for pid 17 using YourCallBack-function which is stdcall and you want 4k-blocks
STREAMREADER_API BOOL SetFilter(WORD pid,void* lpFunc, DWORD CallBackType, DWORD size, DWORD *lpfilter_num);


Habe es so probiert:

Public Class Form1

Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim i As Short
Dim MeStream As MySRead
MeStream = AddressOf ReadDataFunction
'For i = 1 To TextBox7.Text
RichTextBox1.Text = RichTextBox1.Text & Chr(13) & "SetFilter " & SetFilter(TextBox7.Text, MeStream, TextBox8.Text, TextBox9.Text, &H0)
RichTextBox1.Text = RichTextBox1.Text & Chr(13) & "DelFilter " & Streame.DelFilter(0)
'Next
End Sub
Public Shared Function ReadDataFunction(ByVal buff As Byte, ByVal Leg As Int16) As Object
A2 = buff
A1 = Leg
End Function
#Region "Dll- Import"
<DllImport("streamreader.dll")> _
Public Shared Function SetFilter(ByVal PID As Int16, ByVal ReadDataFunction As Object, ByVal CallBackTyp As Int16, ByVal Size As Int16, ByVal filter_num As Int16) As Boolean
End Function
#End Region
#Region "Delegate-Deklaration"
Public Delegate Function MySRead(ByVal buff As Byte, ByVal Leg As Int16) As Object
#End Region

End Class

Kann mir jemand weiterhelfen, wo der Fehler liegt

cu
 

zovax

Erfahrenes Mitglied
Versuchs mal mit folgender Deklaration (in C#, hatte grade keine Lust mich mit VB rumzuquälen, sollte aber natürliuch kein Problem sein das umzuschreiben :))

Code:
[DllImport("streamreader.dll")]
public static extern void SetFilter (int PID,
[MarshalAs(unmanagedType.LPArrray)] byte[] buf, int CallBackTyp,
int Size, int filer_num);
 

Keyjunkie

Grünschnabel
Danke zovax,

C# ist für mich auch nicht nachvollziehbar. Ich bin gerade am umsteigen von vb6 nach VB.Net und habe damit genug Probleme. Wenn du dir vielleicht doch die Mühe machen könntest, es in VB um zusetzten, währe sehr nett von Dir.

CU
 

zovax

Erfahrenes Mitglied
Eigentlich unterscheidet sich VB.NET von C# ja nur in der Syntax, mehr nicht.
Ich selbst programmiere nur C#, kann aber auch ohne jemals eine Zeile VB.NET Code geschrieben zu haben den auch ohen Probleme lesen. Es sind ja die gleichen Typen..

Aber hier meine ersten 3 Zeilen VB.NET :)
Code:
<DllImport("streamreader.dll")> _
Public Shared Function SetFilter(ByVal PID As Int16, 
<MarshalAs(UnmanagedType.LPArray)> ByVal buf() As Byte, 
ByVal CallBackTyp As Int16, ByVal Size As Int16, 
ByVal filter_num As Int16) As Boolean
End Function
 

Keyjunkie

Grünschnabel
Ich sage nochmals Danke für deine Mühe

Von VB6 auf VB.net ist schon eine Riesen Umstellung für mich. Das MarshalAs ist komplett unbekannt für mich und ich muss mich jetzt erst mal einarbeiten. Dachte das dieser Addressof Aufruf mit einer Delegate Anweisung zu bewerkstelligen ist. So wie du mir das jetzt geschickt hast, muss ich erst mal mich wieder einlesen.

Nochmals Danke
CU
 

Keyjunkie

Grünschnabel
Super,

hat mich ein wenig weiter gebracht. Bekomme jetzt ein "True" beim Aufruf der dll. Nur die Array kann ich nicht einlesen. In VB.6 wurde das mit "AddresOf" gemacht, da musste ich dann keine Variable Übergeben. Wenn ich jetzt aufrufe wird eine Variable verlangt. Sobalt ich mit Delegate und AddresOf in VB.Net aufrufe wird nach meinem Verständnis nach nicht in die Original Funktion gesprungen, sonder in die Delegierte. Was wiederum die Folge hat das ich nicht an die Adresse Springe wo die Array Daten meiner Dll stehen.

Komme irgend wie nicht ans Ziel.

CU
 

trisax

Grünschnabel
Hi to all

Public Class StreamReader
Public Delegate Function myCallBack(ByVal buff As String, ByVal lLen As Integer) As Boolean
'You have to to declare this in your function

<DllImport("streamreader.DLL", EntryPoint:="SetFilter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function SetFilter(ByVal pid As Integer, ByVal lpFunc As myCallBack, ByVal CallBackType As Integer, ByVal size As Integer, ByVal lpfilter_num As Integer) As Boolean
End Function

End Class

Sub YourSub()
if SetFilter(211, AddressOf StreamCallBack, 2, 2, filterHandle)= True then
'The CallBack is set
End Sub

Public Function StreamCallBack(ByVal buff As String, ByVal lLen As Integer) As Boolean
'Here you can write your code
'But this works only for few seconds and crashs :( I don't know the reason
'I've yet done a simple program if someone wants to cooperate than mail me :)
'Trisax@hotmail.com
End Function
 
Zuletzt bearbeitet: