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

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

15.10.2018, 19:56. Показов 5539. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru