Callback Funktion aus einer c .Dll

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von matzemaschine.

    Callback Funktion aus einer c .Dll

    Hallo an alle ich bin Anfänger und

    ich habe ein Problem auf eine in einer c .Dll definierten Callback Funktion zuzugreifen.

    Mir steht leider nur eine Beschreibung der DLL zur Verfügung und mein Problem bezieht sich auf eine Callback Möglichkeit dieser Funktion

    DLL Beschreibung:

    Function : Long dncc_initialize(DNCC_PARA *para)

    DNCC_Para *para

    Typdef struct {

    Dword Ipaddr

    Dword port

    Dword ownPort

    DNCC_Result ( *Callback) DNCC_Handel, DNCC_Event, Void *)

    Dword Timeout[20]

    Dword retry[20]


    } DNCC_PARA


    Ich habe zunächst die DLL über DLL Import in mein Program eingebunden .


    VB.NET-Quellcode

    1. <DllImport("dncc_api_pc.dll", CharSet:=CharSet.Ansi)> PrivateSharedFunction _
    2. dncc_Initialize( ByVal Ipaddr AsString, ByVal port AsInteger, ByVal ownPort AsInteger) AsIntegerEndFunction



    und habe dann über


    VB.NET-Quellcode

    1. dncc_Initialize("194.25.181.107", 7001, 7001)



    darauf zuzugreifen und bekomme keinen Fehler. Problem ich weiß nicht wie ich auf die Callbackfunktion zugreifen kann. Muss ich die Callback Funktion über byval einfügen ?? . Oder muss ich um auf diese Funktion zuzugreifen einen Wrapper schreiben und wenn ja wie geht das.
    Danke schon mal für eure Hilfe. Ich habe leider für dieses Problem sehr wenig bei Google gefunden.


    Warum hast Du denn dieses Thema als erledigt markiert?
    Ich bin am Mechanismus Event aus C++ nach .NET interessiert, geht wohl in dieselbe Kerbe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry muss ausversehen passiert sein kann man das rückgängig machen ?

    Ich denke schon dass das in diese Richtung geht, bin mir aber nicht ganz sicher.

    Ich habe hier ein Problem das ich eine c .Dll habe, die einen Server öffnen soll. Wenn sich der Client anmeldet sollte ich über die Callback Funktion benachrichtigt werden und den Client ini Daten übergeben.

    Die Funktion die ich unten als "dncc_Initialize" aufgeführt habe soll eben diesen Server öffnen. Der erweiterte Code den ich gestern geschrieben habe hat beim kompilieren keinen Fehler, er findet auch die DLL aber ich bekomme keine Antwort von der Callback Funktion.


    VB.NET-Quellcode

    1. <DllImport("D:\Users\matera\Projekte VB\Wrapper\DnccInitWrap\DnccInitWrap\release\DnccInitWrap.dll", CharSet:=CharSet.Ansi)> Private Shared Function Initialize(<[In]()> ByVal dncPara As DNCC_PARAM) As IntegerEnd Function

    VB.NET-Quellcode

    1. Private Class DNCC_PARAM
    2. Public nMacNo As UInt32
    3. Public nOwnPort As UInt32
    4. Public nIpAddr As UInt32
    5. Public nNCPort As UInt32
    6. <MarshalAsAttribute(UnmanagedType.FunctionPtr)> Public CallBackFunction As [Delegate]<MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public arrTimeout As Short() = New Short(20 - 1) {}
    7. <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public arrRetry As Short() = New Short(20 - 1) {}
    8. End Class


    VB.NET-Quellcode

    1. Sub AppCallBack(ByVal iHandle As String, ByVal iEvent As String, ByVal arg As String)
    2. MessageBox.Show(iHandle & iEvent & arg)
    3. Select Case (iEvent)
    4. Case "E_S_INITIAL: // 2-3-1-1. Initial data"
    5. MessageBox.Show("funtzt")
    6. Case "E_C_MODECHG: // 2-3-2-1. FMS Mode change"
    7. End Select
    8. End Sub


    und den Aufruf der aber leider keine Antwort gibt.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Ipadress As UInt32
    3. Dim IPs As IPAddress
    4. Dim param As New DNCC_PARAM()Dim ipAddr As IPAddress = IPAddress.Parse("194.25.181.233")
    5. Ipadress = ipAddr.Addressparam.CallBackFunction = New TypeOfCallBackFunction(AddressOf AppCallBack)
    6. param.nIpAddr = Ipadress
    7. param.nMacNo = 2
    8. param.nOwnPort = 7002
    9. param.nNCPort = 7002
    10. Initialize(param)
    11. End Sub

     
     
     
     

    matzemaschine schrieb:

    Sorry muss ausversehen passiert sein kann man das rückgängig machen ?

    Dein Beitrag hat es rückgängig gemacht. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich musste die IP Adresse in ein Integer umwandeln

    VB.NET-Quellcode

    1. Dim ipAddr As IPAddress = IPAddress.Parse("194.25.181.233")
    .
    Hab jetzt ein neues Problem ich Versuche auf eine andere Funktion zuzugreifen und muss einen Hex Wert übergeben Hex = 0x40000000 was ein bestimmtes bit True setzt. Problem VB macht mir immer einen Integer Wert daraus und das scheint meine C.Dll nicht zu fressen. Hat jemand eine Idee???
    Das Übergeben geht völlig problemlos, wenn die Deklaration Deiner DLL-Prozedur korrekt ist.
    Die Umwandlung einer IP-Adresse in ein Integer ist vom Grundsatz her nicht ganz sauber, wie soll denn das funktionieren?
    Gibt es da eine Vorschrift?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja du hast recht mit der IP Adresse, Problem ist das ich eine IP Adresse in ein UInt 32 wandeln muss und ich für dieses Problem auf eine alte Funktion zugegriffen habe, was dem Debugger auch nicht gefällt aber es Funtzt. Hast du Vorschläge für eine schönere Variante ?

    zu der Deklaration

    VB.NET-Quellcode

    1. <DllImport("D:\Users\matera\Projekte VB\BCT Herr Drewing\OKUMA_OSP_M_Sample\Release\dncc_api_pc.dll", CharSet:=CharSet.Ansi)> Private Shared Function dncc_SendInitialData(ByVal hdl As Integer, ByVal init As UInt32) As IntegerEnd Function
    Gut das Problem mit der anderen Funktion hat sich auch gegeben es lag an dem Aufruf der unter .dll muss im gleichen Verzeichnis sein. Zur Vollständigkeit möchte ich noch meinen C++ Wrapper zur Verfügung stellen, da ich dieses Thema jetzt als erledigt sehe. Vielen Dank an alle.

    VB.NET-Quellcode

    1. #include "stdafx.h"
    2. #include "dncc_aplib.h"
    3. #pragma comment(lib, "dncc_api_pc.lib")
    4. static DNCC_RESULT (*_lpfnCallBack)(DNCC_HANDLE , DNCC_EVENT , VOID* );
    5. typedef DNCC_RESULT (CALLBACK *STDCALL_CALLBACK)(DNCC_HANDLE, DNCC_EVENT, void*);static DNCC_RESULT _CallBackWrapper(DNCC_HANDLE handle, DNCC_EVENT event, VOID* args)
    6. {if(_lpfnCallBack != NULL && !IsBadCodePtr((FARPROC)_lpfnCallBack))
    7. {
    8. STDCALL_CALLBACK _stdCallBack = (STDCALL_CALLBACK)_lpfnCallBack;(_stdCallBack)(handle, event, args);
    9. }
    10. }
    11. static DNCC_PARAM _para;extern "C" __declspec(dllexport) DNCC_HANDLE WINAPI Initialize(DNCC_PARAM *para)
    12. {
    13. // Save the structure for callback simulationCopyMemory(&_para, para, sizeof(_para));
    14. // Save the __cdecl callback
    15. _lpfnCallBack = para->CallBack;
    16. // Use callback wrapper
    17. _para.CallBack = _CallBackWrapper;return dncc_Initialize(&_para);
    18. }extern "C" __declspec(dllexport) void WINAPI SimulateCallback()
    19. {
    20. _para.CallBack(1, 2, 0);
    21. }
    22.  
    23.  
    24. BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    25. {
    26. UNREFERENCED_PARAMETER(hModule);
    27. UNREFERENCED_PARAMETER(dwReason);
    28. UNREFERENCED_PARAMETER(lpReserved);return TRUE;
    29. }