powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как перехватить исключения в DLL?
4 сообщений из 4, страница 1 из 1
Как перехватить исключения в DLL?
    #40031963
VaneS Ri_lax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Пишу приложение на c# которое работает с кард ридером, читает смарт карты.
В классе используются функции импортированные из dll.
Все работает ок, но если карту быстро вставить и быстро вытащить, (приложение не успевает считать данные с карты), то мое приложение просто завершается, а студия пишет вот что:
Код: c#
1.
Программа "[23044] CardReader.exe" завершилась с кодом -1073740940 (0xc0000374).


Вот мой код:
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
using RMISCardReader.Reader;
using RMISCardReader.Webserver;
using System;
using System.Runtime.InteropServices;

namespace RMISCardReader
{
    class KardReaderClient
    {
        public struct PersData
        {
            public string DATEOFBIRTH;
            public string LASTNAME;
            public string FIRSTNAME;
            public string MIDDLENAME;
            public string GENDER;
            public string BIRTHPLACE;
            public string NUMBERSNILS;
            public string NUMBEROMS;
        }

        public static PersData outData = new PersData();
        public static MainDocument outDocument = new MainDocument();
        public static personInfo personInf = new personInfo();
        public static string readerList = "[]";


        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern void getVersion(out string version);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern int Authorization(string password);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern int GetReaderList(out string readers);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern int GetPersData_(out PersData data, int flags);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern int GetMainDocument_(out MainDocument data);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern void ReleasePersData(out PersData data);

        [DllImport(SettingLoader.PathToDLLFile)]
        public static extern void ReleaseMainDocument(out MainDocument data);

        public static void updatePersonInfo()
        {
            try
            {
                if (CardReaderStatus.getCardStatus(CardReaderStatus.getReaderList()[0])) //проверяет есть ли карта в ридере
                {
                    // ошибка возникает тут
                    PersData data;
                    int error = GetPersData_(out data, 0x3f); //функция из DLL
                    Console.WriteLine("Ошибка GetPersData_: " + error);
                    if (error != 36864)
                    {
                        Console.WriteLine("Не удалось получить данные о пользователе карты: " + error);
                    }
                    
                }
                else
                {
                    Console.WriteLine("Попытка обновить данные без карты");
                }
            }
            catch(Exception ex){
                Console.WriteLine("Мое исключение KardReaderClient: " + ex.Message);
            }
            
        }
        
    }
}


Если я убираю этот код, то есть функция не вызывается, то все работает:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// ошибка возникает тут
                    PersData data;
                    int error = GetPersData_(out data, 0x3f); //функция из DLL
                    Console.WriteLine("Ошибка GetPersData_: " + error);
                    if (error != 36864)
                    {
                        Console.WriteLine("Не удалось получить данные о пользователе карты: " + error);
                    }


Как отловить это исключение?
...
Рейтинг: 0 / 0
Как перехватить исключения в DLL?
    #40032064
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без сторонних dll нельзя организовать считывание карты?
...
Рейтинг: 0 / 0
Как перехватить исключения в DLL?
    #40032090
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вообще ошибка 0xc0000374 - это heap corrution, повреждение кучи, и эта ошибка является, как и, например, access violation, критической - после таких ошибок приложение с большой гарантией не сможет нормально продолжить работу. Перехватывать такие ошибки можно только с одной целью - внятно сообщить пользователю, что что-то не так, и завершить работу. Как подобные ошибки перехватываются - см. здесь .
...
Рейтинг: 0 / 0
Как перехватить исключения в DLL?
    #40032171
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaneS Ri_lax,

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


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