Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как грамотно импортировать managed функцию

1.7K
20 октября 2006 года
alektrik
140 / / 16.01.2006
Как импортировать функцию capSetCallbackOnFrame(HWND, fpProc)

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;
713
20 октября 2006 года
Ap0k
360 / / 13.03.2006
ты хочешь передать managed "функцию" в качестве callback фунцкции в неуправляемую среду? тогда наверно речь идёт об экспорте...
Используй делегаты... (если я правильно протрактовал постановку вопроса). Возникнут вопросы ка это сделать - пиши ;)
273
21 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Вот так получается:
Код:
[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]

С чтением из unmanaged памяти по указателям IntPtr думаю не вызовет проблем (используй класс Marshal).
1.7K
21 октября 2006 года
alektrik
140 / / 16.01.2006
упс... каюсь.. прально заметил - из unmanaged в managed... но всё равно не работает... по моему с delegate'oм чё-то не то, потому что сама функция (capVideoStreamCallback) возвращает true, тобишь всё норма... уже млин вот таким макаром неделю бьюсь, а сделать нада...
1.7K
21 октября 2006 года
alektrik
140 / / 16.01.2006
То что сделал:
Код:
[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);


P.S. для C++ типа HWND в C# лучше использовать IntPtr (проверено - работает, даже в Form'ах Handle типа IntPtr)
273
22 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Какая ошибка появляется. Если неправильно выполнен маршаллинг то должно появиться исключение. Если просто функция возвращает true и более ничего не происходит, то советую проверить Windows-ошибку через GetLastError.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог