Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 30.09.18 03:10 
Hallo Forum

Problemstellung:
Ein Callback / delegate soll aus einer unmanaged DLL in C# übernommen werden.
Aus der Headerdatei geht folgendes hervor:

ausblenden Vfw.h
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
// ------------------------------------------------------------------
//  Window Messages  WM_CAP... which can be sent to an AVICAP window
// ------------------------------------------------------------------
// Defines start of the message range
#define WM_CAP_START                    WM_USER

// start of unicode messages
#define WM_CAP_UNICODE_START            WM_USER+100

#define WM_CAP_SET_CALLBACK_STATUSW    (WM_CAP_UNICODE_START+  3)
#define WM_CAP_SET_CALLBACK_STATUSA    (WM_CAP_START+  3)
#ifdef UNICODE
#define WM_CAP_SET_CALLBACK_STATUS      WM_CAP_SET_CALLBACK_STATUSW
#else
#define WM_CAP_SET_CALLBACK_STATUS      WM_CAP_SET_CALLBACK_STATUSA
#endif

// ------------------------------------------------------------------
//  Callback Definitions
// ------------------------------------------------------------------
typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKW) (_In_ HWND hWnd, _In_ int nID, LPCWSTR lpsz);
typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKA) (_In_ HWND hWnd, _In_ int nID, LPCSTR lpsz);
#ifdef UNICODE
#define CAPSTATUSCALLBACK  CAPSTATUSCALLBACKW
#else
#define CAPSTATUSCALLBACK  CAPSTATUSCALLBACKA
#endif

// Macro
#define capSetCallbackOnStatus(hwnd, fpProc)       ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, (LPARAM)(LPVOID)(fpProc))) // "AVICapSM()" entspricht einem SendMessage() Aufruf


Und so sieht meine C# Übersetzung aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public static class VfW
{
    // Video Capture Messages
    private const int WM_CAP_START                    = 0x400;
    private const int WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_START + 3;

    // Video Capture Callbacks
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate int capStatusCallback(IntPtr hWnd, int nID, StringBuilder lpsz);

    // Video Capture Macros
    public static bool capSetCallbackOnStatus(IntPtr hwnd, capStatusCallback fpProc)
    {
        IntPtr pCallback = IntPtr.Zero;
        Marshal.GetDelegateForFunctionPointer(pCallback, typeof(capStatusCallback));

        return SendMsgB(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, pCallback); 
    }

    // Additional Functions
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern bool SendMsgB(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
}

Stimmt das soweit? Oder soll anstelle von Marshal.GetDelegateForFunctionPointer(), Marshal.GetManagedThunkForUnmanagedMethodPtr() aufgerufen werden? Oder doch etwas anderes? :nixweiss:

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3949
Erhaltene Danke: 810

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 30.09.18 07:47 
Hallo,

du verwendest doch fpProc bisher gar nicht innerhalb der Methode?!

Und möchtest du nicht eher Marshal.GetFunctionPointerForDelegate verwenden?
ausblenden C#-Quelltext
1:
2:
3:
IntPtr pCallback = Marshal.GetFunctionPointerForDelegate(fpProc);

return SendMsgB(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, pCallback);

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 30.09.18 10:57 
Vielen Dank, Th69!

Daher auch die Frage, weil ich nicht wusste, wo ich fpProc überhaupt übergeben soll.
Marshal.GetFunctionPointerForDelegate() ist genau das, was ich gesucht habe.

Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)