Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 1

Использование метода из dll (C++) с callback аргументами в C# программе?

23.01.2019, 11:28. Показов 903. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже всю голову сломал, не могу разобраться с тем, как сопоставить типы данных параметров.
Расскажу подробнее. Есть радиоприемник управляемый по usb, для реализации его функций в комплекте поставки идёт их SDK с библиотекой на C++. В SDK обозначен пример на C#, но там не реализовывалась необходимая мне функция.
Вот так выглядит описание метода:
SetupStreams
Function for activating the IF and/or audio streams callback functions while the demodulator is active.
C++
1
2
3
BOOL __stdcall SetupStreams(int hRadio,
void (__stdcall *IFH)(void *,void *,uint32_t,uint32_t),void *IFT,
void (__stdcall *AudioH)(void *,void *,uint32_t,uint32_t),void *AudioT);
Где:
hRadio - Handle to a radio device that was returned by OpenRadioDevice or Open.
IFH - Application provided function to be called by the API when there is new data received through the IF stream from the receiver; if NULL IF streaming is nolonger sent to the application
IFT - Argument to be passed to the IFH application defined callback function
AudioH - Application provided function to be called by the API when there is new data received through the audio stream from the receiver; if NULL audio streaming is nolonger sent to the application
AudioT - Argument to be passed to the AudioH application defined callback function
Return Value - The return value is TRUE if the streams callback functions could be properly set and FALSE if not.

Вид функции callback.
For demodulators that provide more channels (like ISB), both channels are provided in the audio stream with alternating samples.
Both callback functions should like like this:
C++
1
void __stdcall Handler(void *Target,void *Buf,uint32_t Size,uint32_t SamplingRate);
The arguments are the following ones:

Target - application specified value when the callback functions are registered;
Buf - buffer with the 16-bit signed integer samples read from the DSP memory;
Size - size of the buffer holding the samples in bytes;
SamplingRate - samples sampling rate.
The buffers sent to the application defined callback functions will always have the same size and will always contain the same number of samples of samples sets. In no case they will contain fractions of samples or samples sets.

На C# методы я реализовал таким образом:
C#
1
2
3
4
5
6
7
[UnmanagedFunctionPointer(Calling invention.StdCall, CharSet=ChaSet.Ansi)]
public delegate void IFHandler(IntPtr target, IntPtr buf, UInt32 size, UInt32 samplingrate);
[UnmanagedFunctionPointer(CallingConvertion.StdCall,CharSet = CharSet.Ansi)]
public delegate void AudioHandler(IntPtr target, IntPtr buf, UInt32 size, UInt32 samplingrate);
 
[DllImport("WRG315API.dll",CallingConvertion = CallingConvertion.StdCall)]
public static extern bool SetupStreams(int radioHandle, IFHandler ifhandler, IntPtr iftIntPtr, AudioHandler audioHandler, IntPtr audioT);
Далее создал делегат и переменную типа IntPtr и подал на вход метода SetupStrems. Причем, чтобы работал только один делегат этот метода допускает подачу нулевых ссылок вместо делегата и указателя.
C#
1
2
3
4
5
6
7
8
9
10
11
12
IntPtr a;
public void InitializeReciever()
{
   ...
   IFHandler ifHandler = new IFHandler(IFH);
   SetupStreams(_radioHandle, ifHandler, a, null, IntPtr.Zero);
}
 
private void IFH(IntPtr target, IntPtr buf, UInt32 size, UInt32 samplingrate)
{
    //Здесь как то нужно скопировать память из buf в target...
}
При выполнении метод SetupStreams отрабатывает без ошибок, программа заходит в делегат, выполняет там действия (это если смотреть через отладчик поэтапно), а если просто запустить программу на выполенение, то она переходит в режим:
"Приложение находится в режиме приостановки выполнения.
Приложение перешло в состояние останова, но в данный момент не выполняется код, который поддерживается выбранным модулем отладки"

Мне кажется, что я где то неправильно определил типы данных...или как то ссылки на область памяти не выделил...Очень нужна помощь в этом вопросе.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2019, 11:28
Ответы с готовыми решениями:

Использование самописной DLL в программе
Добрый день все, подскажите пожалуйста хочу сделать примерно так, но не получается. Форма: Public Class Form1 Public ZIP_Name...

Использование своей DLL в программе.
Очень простой вопрос на который не нашел ответа: сделал dll на С#, теперь хочу подключить и использовать его в: 1) App на С# (Win...

Использование чужой DLL в своей программе
Доброго времени суток. Есть сторонняя DLL для работы с устройством подключенного через COM-Port. Есть только DLL и поэтому статическое...

3
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
23.01.2019, 14:57
nickholas, надо смотреть что там у вас и как. Суть в том вы в методе должны передать ссылки на функции в которых будет происходить обработка. учитывать надо все, типы данных, даже разрядность приложения x64 может внести свои коррективы.
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
23.01.2019, 15:25
Цитата Сообщение от nickholas Посмотреть сообщение
В SDK обозначен пример на C#, но там не реализовывалась необходимая мне функция.
Но есть примеры этих функций на С++

Цитата Сообщение от nickholas Посмотреть сообщение
C#
1
2
3
4
private void IFH(IntPtr target, IntPtr buf, UInt32 size, UInt32 samplingrate)
{
* * //Здесь как то нужно скопировать память из buf в target...
}
Demodulator.cpp

C++
1
2
3
4
void __stdcall SamplesIFHandler(void *Target,void *Buf,DWORD Size,DWORD SamplingRate)
{
    if (Target) fwrite(Buf,1,Size,(FILE *)Target);
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18307 / 14231 / 5368
Регистрация: 17.03.2014
Сообщений: 28,904
Записей в блоге: 1
23.01.2019, 16:39
nickholas, похоже сборщик мусора удаляет экземпляр делегата прежде чем он вызывается. Попробуй сохранить экземпляр делегата в поле класса
C#
1
2
3
4
5
6
7
IFHandler ifHandler;
public void InitializeReciever()
{
   ...
   ifHandler = new IFHandler(IFH);
   SetupStreams(_radioHandle, ifHandler, a, null, IntPtr.Zero);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2019, 16:39
Помогаю со студенческими работами здесь

Использование чужой dll в своей программе
Есть dll-ка wavcarrier.dll. Её использует программа invisible secrets для шифрования файлов и связки их с wav файлом. Так вот, как можно...

Использование Dll написанной в VC++ в программе компилируемой MinGW
Добрый день! Возникла следующая проблема. Из-за некоторой специфики задачи (работа с DirectShow) необходимо написать модуль (dll) в...

callback метода класса
Предыстория: нужно последовательно запускать несколько однотипных циклов большой степени вложенности, в теле которых вызывать разные...

Callback нестатического метода
Здравствуйте, <сомневался куда лучше обратиться в этот раздел или WinAPI> Столкнулся с тем что обратный вызов из ОС возможен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru