powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно сделать "обертку" для функции
6 сообщений из 6, страница 1 из 1
Как правильно сделать "обертку" для функции
    #39998381
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция , весьма универсальная функция - что только не делает. На вход хочет параметр, а на выходе дает структуру (разные структуры), заполненные в зависимости от значения параметра.

Вот только функция эта сишная, и вызов ее сопряжен с кучей лишних строк вроде "маршал", "трай", и т.д. Потому решил сделать для нее обертку, чтобы вызывать по человечески. Получилось что-то вроде:
Код: c#
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.
        private static T MYGetData<T>(int param)
        {
            T struc_ret = default(T);
            IntPtr inp = IntPtr.Zero;

            inp = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));
            try
            {
                if (GetData(param, inp, (uint)Marshal.SizeOf(typeof(T))))
                {
                    struc_ret = (T)Marshal.PtrToStructure(inp, typeof(T));
                }
                else
                {

                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Marshal.FreeHGlobal(inp);
            }
            return struc_ret;
        }



Все вроде работает, пока внутренняя функция нормально отрабатывает, а вот если она выдает фальш, то возвращается default(T); и всю малину портит.

Вот думаю как это переделать? Возвращать bool , а структуру через out ? Или может быть еще как лучше?


ЗЫ ну и заодно вопрос для самоубеждения: Marshal.PtrToStructure создает копию структуры, и она доступна после Marshal.FreeHGlobal или только отображает структуру на память, и после освобождения памяти структуре пушной зверек? А то в майкрософтсовской документации неочень понятно написано "Маршалирует данные из неуправляемого блока памяти в управляемый объект."
...
Рейтинг: 0 / 0
Как правильно сделать "обертку" для функции
    #39998391
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Возвращать bool , а структуру через out ?
Что мешает возвращать кортеж?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        private static (bool success, T result) MYGetData<T>(int param)
        {
            T struc_ret = default(T);
            bool success;
            IntPtr inp = IntPtr.Zero;

            inp = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));
            try
            {
                success = GetData(param, inp, (uint)Marshal.SizeOf(typeof(T))))
                if (success) {
                    struc_ret = (T)Marshal.PtrToStructure(inp, typeof(T));
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Marshal.FreeHGlobal(inp);
            }
            return (success, struc_ret);
        }
...
Рейтинг: 0 / 0
Как правильно сделать "обертку" для функции
    #39998397
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Что мешает возвращать кортеж?

я на 2015 студии, она вроде как не поддерживает.
...
Рейтинг: 0 / 0
Как правильно сделать "обертку" для функции
    #39998452
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает обновить студию?
...
Рейтинг: 0 / 0
Как правильно сделать "обертку" для функции
    #39998529
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычный TryGet паттерн же
bool TryGetData(arg, out T value)
...
Рейтинг: 0 / 0
Как правильно сделать "обертку" для функции
    #40004463
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Есть функция , весьма универсальная функция - что только не делает. На вход хочет параметр, а на выходе дает структуру (разные структуры), заполненные в зависимости от значения параметра.

Вот только функция эта сишная, и вызов ее сопряжен с кучей лишних строк вроде "маршал", "трай", и т.д. Потому решил сделать для нее обертку, чтобы вызывать по человечески. Получилось что-то вроде:
Код: c#
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.
        private static T MYGetData<T>(int param)
        {
            T struc_ret = default(T);
            IntPtr inp = IntPtr.Zero;

            inp = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));
            try
            {
                if (GetData(param, inp, (uint)Marshal.SizeOf(typeof(T))))
                {
                    struc_ret = (T)Marshal.PtrToStructure(inp, typeof(T));
                }
                else
                {

                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Marshal.FreeHGlobal(inp);
            }
            return struc_ret;
        }



Все вроде работает, пока внутренняя функция нормально отрабатывает, а вот если она выдает фальш, то возвращается default(T); и всю малину портит.

Вот думаю как это переделать? Возвращать bool , а структуру через out ? Или может быть еще как лучше?


ЗЫ ну и заодно вопрос для самоубеждения: Marshal.PtrToStructure создает копию структуры, и она доступна после Marshal.FreeHGlobal или только отображает структуру на память, и после освобождения памяти структуре пушной зверек? А то в майкрософтсовской документации неочень понятно написано "Маршалирует данные из неуправляемого блока памяти в управляемый объект."


да, а тут ни кучи "маршал", ни "трай"
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно сделать "обертку" для функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]