Interop Probleme mit eigener DLL

  • C#

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von rykoJLL.

    Interop Probleme mit eigener DLL

    Guten Abend,
    wie der Titel schon sagt habe ich einige Probleme mit der Verwendung einer nativen DLL in C#. Weil mir der ganze Interop Aufwand bei WinApi zu viel ist,habe ich mir dazu eine C++ DLL geschrieben,die die nötigen Funktionen enthält.
    Mein Problem ist,dass ich ne System.EntryPointNotFoundException geworfen bekomme.
    Hier die Methoden Definitionen.

    C#-Quellcode

    1. //USB Helper.h
    2. #include <Windows.h>
    3. #include <dbt.h>
    4. #include <string>
    5. extern bool __declspec(dllexport) RegisterDeviceToHwnd(HWND hwnd, HDEVNOTIFY* hDeviceNotify);
    6. extern bool __declspec(dllexport) UnregisterHwnd(HDEVNOTIFY *hDeviceNotify);


    Verwendung in C#

    C#-Quellcode

    1. [DllImport("USB Helper.dll", CallingConvention = CallingConvention.Cdecl)]
    2. static extern bool UnregisterHwnd(IntPtr hDeviceNotify);
    3. [DllImport("USB Helper.dll",CallingConvention = CallingConvention.Cdecl)]
    4. static extern bool RegisterDeviceToHwnd(IntPtr hwnd, IntPtr hDeviceNotify);
    5. private void frmSynchron_Load(object sender, EventArgs e)
    6. {
    7. IntPtr hDeviceNotify = IntPtr.Zero;
    8. if (RegisterDeviceToHwnd(this.Handle, hDeviceNotify)) //Hier tritt die Exception auf
    9. {
    10. MessageBox.Show("Sucess!");
    11. }
    12. }
    13. protected override void WndProc(ref Message m)
    14. {
    15. switch (m.Msg)
    16. {
    17. case WM_DEVICECHANGE:
    18. {
    19. if((int)m.WParam == DBT_DEVNODES_CHANGED)
    20. {
    21. MessageBox.Show("New Device LOL");
    22. break;
    23. }
    24. break;
    25. }
    26. }
    27. base.WndProc(ref m);
    28. }
    Das Problem liegt nicht in C#.
    Wenn du es in C++ schreibst, dann "dekoriert" der Compiler den Namen der Funktion, um die Überladungen davon zu bekommen.
    Also musst du dem Compiler sagen, dass er das nicht tun darf!

    C#-Quellcode

    1. #include <windows.h>
    2. BOOL __stdcall DllMain(HINSTANCE hInst,
    3. DWORD dwReason,
    4. LPVOID lpReserved) {
    5. return TRUE;
    6. }
    7. extern "C" __declspec(dllexport) void __stdcall Message(char* p_szMessage)


    Das macht hier das extern "C"

    Gugge mal da: codeguru.com/csharp/csharp/cs_…ng-Unmanage-Code-in-C.htm
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: