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

Подключение неуправляемого кода

15.10.2018, 19:56. Показов 5838. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код на С++

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct auth_answer{
   int TType;             /**< [in] тип транзакции. см ::OpetationTypes */
   unsigned long Amount;  /**< [in] сумма в копейках                    */
   char RCode[3];         /**< [out] код результата авторизации         */
   char AMessage[16];     /**< [out] текст результата авторизации       */
   int  CType;            /**< [in,out] тип карты                       */
   char* Check;           /**< [out] образ чека, должен освобождаться GlobalFree в вызывающей программе */
};
 
struct auth_answer5{
  struct auth_answer auth_answ;   /**< [in]  Основные параметры операции. См. ::auth_answer */
  char   RRN[MAX_REFNUM];         /**< [in,out] Номер ссылки операции, присвоенный хостом. Используется
                                                для операций возврат и множественной авторизации.
                                                Содержит уникальный 12-значный ссылочный номер.
                                                При предавторизации это поле является выходным
                                                (его заполняет библиотека pilot_nt.dll), а при
                                                завершении расчета – входным (значение должно 
                                                быть заполнено вызывающей программой; оно должно
                                                совпадать со значением, возвращенным при предавторизации).*/
  char   AuthCode[MAX_AUTHCODE]; /**< [out] Код авторизации. 7 байт.                       */
};
 
PILOT_NT_API int card_authorize(char track2, struct auth_answer auth_answer);
Сделал на C# аналог не без помощи форумчан

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public unsafe struct auth_answer
        {
            public OpetationTypes TType { get; set; }
            public uint  Amount { get; set; }
            public fixed byte RCode[3];
            public fixed byte AMessage[16];
            public int CType { get; set; }
            public IntPtr check;            
        }
 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public unsafe struct auth_answer5
        {
            public auth_answer auth_answ;
            public fixed byte RRN[MAX_REFNUM];
            public fixed byte AuthCode[MAX_AUTHCODE];
         }
 
         [DllImport(".\\WIN\\pilot_nt.DLL", EntryPoint = "_card_authorize5", CallingConvention = CallingConvention.StdCall)]
        private static extern int card_authorize5(string truck,ref auth_answer5 InStrict);
Все работает, но как вытащить check?
C#
1
chequeSTR = Marshal.PtrToStringAnsi(Auth_answer.auth_answ.check);
дает пустую строку
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2018, 19:56
Ответы с готовыми решениями:

Запуск неуправляемого кода внутри кода c#
часто требуется при выполнении программы запускать исполняемые файлы (exe) с ключами. Для этого использую пространство имен using...

Быстродействие управляемого и неуправляемого кода
начал изучать небезопасный код,написал прогу в ней 2 функции одна с управляемым кодом вторая нет,так вот сравнил время выполнения этих...

Вызов неуправляемого кода из длл
Замучался с маршилингом! Есть функция в длл: RetCode = HMM_Path_Init( char *path ); RetCode – код возврата ( тип DWORD ) Как...

25
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.10.2018, 14:37
Лучший ответ Сообщение было отмечено VicNic как решение

Решение

Студворк — интернет-сервис помощи студентам
Кароче всё в целом просто, осталось только решить Вашу проблему
объявляем у себя такую функцию:
C#
1
2
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int _controlfp(int newControl, int mask);
далее объявляем набор констант:
C#
1
2
3
4
5
6
7
8
9
const int _RC_NEAR = 0x00000000;
        const int _PC_53 = 0x00010000;
        const int _EM_INVALID = 0x00000010;
        const int _EM_UNDERFLOW = 0x00000002;
        const int _EM_ZERODIVIDE = 0x00000008;
        const int _EM_OVERFLOW = 0x00000004;
        const int _EM_INEXACT = 0x00000001;
        const int _EM_DENORMAL = 0x00080000;
        const int _CW_DEFAULT = _RC_NEAR + _PC_53 + _EM_INVALID + _EM_ZERODIVIDE + _EM_OVERFLOW + _EM_UNDERFLOW + _EM_INEXACT + _EM_DENORMAL;
далее после работы с Вашим терминалом в самом конце вызываем
C#
1
_controlfp(_CW_DEFAULT, 0xfffff);
0
0 / 0 / 0
Регистрация: 14.10.2018
Сообщений: 20
17.10.2018, 14:47  [ТС]
Я повторюсь, если я переключаюсь на другой тип терминала, то ни где не вылетает. Эта форма спокойно вызывается. Я просто дал экскпшн вылета на этой форме как пример. Могу кликнуть на кнопки сверху или вызвать окно с репертуаром - эффект вылета. Вызов сбера что то рушит в коде. Что не знаю
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.10.2018, 14:49
VicNic, дело в коде библиотеки терминала сбера, код выше должен решать эту проблему, пробуйте
0
0 / 0 / 0
Регистрация: 14.10.2018
Сообщений: 20
17.10.2018, 15:21  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
Кароче всё в целом просто, осталось только решить Вашу проблему
объявляем у себя такую функцию:
C#
1
2
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int _controlfp(int newControl, int mask);
далее объявляем набор констант:
C#
1
2
3
4
5
6
7
8
9
const int _RC_NEAR = 0x00000000;
        const int _PC_53 = 0x00010000;
        const int _EM_INVALID = 0x00000010;
        const int _EM_UNDERFLOW = 0x00000002;
        const int _EM_ZERODIVIDE = 0x00000008;
        const int _EM_OVERFLOW = 0x00000004;
        const int _EM_INEXACT = 0x00000001;
        const int _EM_DENORMAL = 0x00080000;
        const int _CW_DEFAULT = _RC_NEAR + _PC_53 + _EM_INVALID + _EM_ZERODIVIDE + _EM_OVERFLOW + _EM_UNDERFLOW + _EM_INEXACT + _EM_DENORMAL;
далее после работы с Вашим терминалом в самом конце вызываем
C#
1
_controlfp(_CW_DEFAULT, 0xfffff);
Гдето уже это видел на англоязыяном сайте. Попробую...

Добавлено через 10 минут
ЗАРАБОТАЛО!!!!!!
А можно пояснения?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.10.2018, 15:28
VicNic, как я сказал выше уже, у терминала кривая библиотека, но т.к Вам только с ней и работать то придётся довольствоваться таким методом.
Суть такова, что после обращения к данной библиотеке сбивается FPU-регистр CW, туда помещается значение которое математическому сопроцессору "убивает" голову напрочь. А WPF очень любит свой контролы инициализировать значениями double.NaN о которых я спрашивал ранее, так вот когда эти значения меняются и выходит наружу что мат. сопроцессор сломан и выдаёт ошибку ArithmeticException.

Как-то так, объяснять не особо моё)
0
0 / 0 / 0
Регистрация: 14.10.2018
Сообщений: 20
17.10.2018, 15:33  [ТС]
Нашел сам объяснения... В точку!!!!!

Добавлено через 1 минуту


Добавлено через 1 минуту
В личке запрос...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2018, 15:33

Как обрабатывать исключения из неуправляемого кода?
Здравствуйте. В приложении используется сторонняя библиотека на c++, в которой периодически возникают ошибки. Ведут они себя не как...

Из неуправляемого кода стороннего приложения, передать в свое приложение массив байт
Опишу сначала суть задачи, 1. Требуется из неуправляемого кода стороннего приложения, передавать в мое приложение массив байт, с условием...

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE OnReceivePacket( /* */ long dwSize, ...

Подключение Python кода в С# проект
Есть ли какие-то способы интегрировать python код в c# проект?

Возможно ли вызвать функции неуправляемого консольного приложения в управляемом коде?
Всем привет! Ребят вопрос общего характера. Есть консольное приложение на C. Возможно ли вызвать функции этого приложения в управляемом...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru