[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2]: [/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].U4)][/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]extern [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][SIZE=2] capSetCallbackOnFrame([[/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].U4)][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][SIZE=2] hWnd, [[/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].FunctionPtr)][/SIZE][SIZE=2][COLOR=#008080]capVideoStreamCallback[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] pFunc);[/FONT][/SIZE]
[SIZE=2]
[FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2]: [/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].U4)][/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]delegate [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][SIZE=2][COLOR=#008080]capVideoStreamCallback[/COLOR][/SIZE][SIZE=2]([[/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].U4)][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] hWnd, [/FONT]
[FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].Struct)] [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2][COLOR=#008080]VIDEOHDR[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] lpVHdr);[/FONT][/SIZE]
[FONT=Courier New][/FONT]
[SIZE=2]
[FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]StructLayout[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]LayoutKind[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Sequential, Pack = 1)][/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]struct [/COLOR][/SIZE][SIZE=2][COLOR=#008080]VIDEOHDR
[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]IntPtr[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] lpData;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwBufferLength; [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwBytesUsed; [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwTimeCaptured; [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwUser; [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]UInt32[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwFlags; [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] public [/COLOR][/SIZE][SIZE=2][COLOR=#008080]IntPtr[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] dwReserved; [/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]
Как грамотно импортировать managed функцию
fpProc - это функция (ПО МОЕМУ)
LRESULT CALLBACK capVideoStreamCallback(
HWND hWnd,
LPVIDEOHDR lpVHdr
);
typedef struct videohdr_tag {
LPBYTE lpData;
DWORD dwBufferLength;
DWORD dwBytesUsed;
DWORD dwTimeCaptured;
DWORD dwUser;
DWORD dwFlags;
DWORD_PTR dwReserved[4];
} VIDEOHDR, NEAR *PVIDEOHDR, FAR * LPVIDEOHDR;
Используй делегаты... (если я правильно протрактовал постановку вопроса). Возникнут вопросы ка это сделать - пиши ;)
Код:
С чтением из unmanaged памяти по указателям IntPtr думаю не вызовет проблем (используй класс Marshal).
упс... каюсь.. прально заметил - из unmanaged в managed... но всё равно не работает... по моему с delegate'oм чё-то не то, потому что сама функция (capVideoStreamCallback) возвращает true, тобишь всё норма... уже млин вот таким макаром неделю бьюсь, а сделать нада...
Код:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct VideoHeader
{
public IntPtr buffer;
public uint BufferLength;
public uint BytesUsed;
public uint TimeCaptured;
public uint User;
public uint Flags;
public IntPtr Reserved;
}
public delegate uint VideoStreamCallback(IntPtr hWnd, ref VideoHeader VHdr);
public UInt32 VideoCallback(IntPtr hWnd, ref VideoHeader vHdr)
{
return 1;
}
private static extern bool SetCallbackOnFrame(IntPtr hWnd, VideoStreamCallback fpProc);
public struct VideoHeader
{
public IntPtr buffer;
public uint BufferLength;
public uint BytesUsed;
public uint TimeCaptured;
public uint User;
public uint Flags;
public IntPtr Reserved;
}
public delegate uint VideoStreamCallback(IntPtr hWnd, ref VideoHeader VHdr);
public UInt32 VideoCallback(IntPtr hWnd, ref VideoHeader vHdr)
{
return 1;
}
private static extern bool SetCallbackOnFrame(IntPtr hWnd, VideoStreamCallback fpProc);
P.S. для C++ типа HWND в C# лучше использовать IntPtr (проверено - работает, даже в Form'ах Handle типа IntPtr)
Какая ошибка появляется. Если неправильно выполнен маршаллинг то должно появиться исключение. Если просто функция возвращает true и более ничего не происходит, то советую проверить Windows-ошибку через GetLastError.