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

Ваш аккаунт

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

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

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

Метод в качесте параметра

18K
23 августа 2006 года
LimeJelly
4 / / 09.08.2006
Я импортирую из DLL функцию, в той функции нужно передавать в качестве параметра имя метода, которая по завершению какой-то операции вызывается. Как это сделать?

Например:
 
Код:
public static extern int Init(сюда_метод);
713
23 августа 2006 года
Ap0k
360 / / 13.03.2006
Уточни, что за DLL ? Native или managed-сборка? Хотя в обоих случаях необходимо использовать делегаты. Как при взаимодействии с неупрвляемым кодом, так и в плностью managed приложениях.
Если же надо передавать именно имя метода, то тут Reflection тебе в помощь. Так что уточни, что именно хочешь получить, ну а пример не заставит долго ждать ;-)
18K
23 августа 2006 года
LimeJelly
4 / / 09.08.2006
DLL точно не на C# и не на .NET. То ли на C, то ли на Assembler.
713
24 августа 2006 года
Ap0k
360 / / 13.03.2006
Телепатов тут нет. Напиши хотя бы прототип функции из DLL.
273
24 августа 2006 года
3A3-968M
1.2K / / 22.12.2005
[quote=Ap0k]Телепатов тут нет. Напиши хотя бы прототип функции из DLL.[/quote]
Делается примерно так:
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]public [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]delegate [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int [/COLOR][/SIZE][SIZE=2][COLOR=#008080]SomeDelegate[/COLOR][/SIZE][SIZE=2](); [/SIZE][SIZE=2][COLOR=#008000]//в виде делегата должен быть прототип функции, которую надо передавать
[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]DllImport[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#800000]"myNativeLib.dll"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New])][/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=#0000ff]int[/COLOR][/SIZE][SIZE=2] NativeFunction([[/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].FunctionPtr)] SomeFunction pFunc);[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] SomeFunction()[/FONT]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080] Console[/COLOR][/SIZE][SIZE=2].WriteLine([/SIZE][SIZE=2][COLOR=#800000]"hello, world"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]);[/FONT][/SIZE]
[SIZE=2][SIZE=2][COLOR=#0000ff][FONT=Courier New] return[/FONT][/COLOR][/SIZE][SIZE=2][FONT=Courier New] 0;[/FONT]
[/SIZE][FONT=Courier New]}[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2] Main([/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] args)[/FONT]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080] SomeDelegate[/COLOR][/SIZE][SIZE=2] sd = [/SIZE][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2][COLOR=#008080]SomeDelegate[/COLOR][/SIZE][SIZE=2](SomeFunction); [/SIZE][SIZE=2][COLOR=#008000]//экземляр делегата
[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] NativeFunction(sd); [/FONT][/SIZE][SIZE=2][COLOR=#008000][FONT=Courier New]//передаём функцию SomeFunction в параметр[/FONT]
[/COLOR][/SIZE][FONT=Courier New][SIZE=2]}
[/SIZE][/FONT]

Если функция принимает нетипизированный указатель на метод (void* ), тогда тип параметра Native-функции будет System.Delegate.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог