Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
1

Нужно найти "аналог" функции

14.02.2016, 22:21. Показов 1209. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Экспозиция.
Код который я буду приводить написан на C# в среде .NET Framework 2.0. В текущем проекте он изменён на 4.5, но изначально базировался на 2.0.
Пишу в этот раздел, т.к. нужно найти "замену" именно C++ функции из WinAPI. В коде по средствам импортирования в проект, внешних функций (extern\DllImport), вызываются члены библиотеки gdi32. В дальнейшем буду ссылаться на сайт http://www.pinvoke.net/ за описанием параметров функций.

Вступление.
Есть задача ("...создать виртуальную камеру со своим источником..."), которая в общем охвате практически решена (функционал, взаимодействие, побочные эффекты), для решения которой я основывался на представленном в этой статье проекте http://www.codeproject.com/Art... -Filter-in
Разобрав "в общих чертах" как функционирует данное приложение, я нашёл место и функцию через которую задаётся очередной фрейм для отображения.

Завязка.
Задаётся отображение в импортированной функции.
В первую очередь, запущенная "камера" дёргает свой метод из класса предоставляющего поток данных VirtualCamStream.FillBuffer
Кликните здесь для просмотра всего текста
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
public override int FillBuffer(ref IMediaSampleImpl _sample)
        {
            {
                AMMediaType pmt;
                if (S_OK == _sample.GetMediaType(out pmt))
                {
                    if (FAILED(SetMediaType(pmt)))
                    {
                        ASSERT(false);
                        _sample.SetMediaType(null);
                    }
                    pmt.Free();
                }
            }
            long _start, _stop;
            HRESULT hr = NOERROR;
            long rtLatency;
            if (FAILED(GetLatency(out rtLatency)))
            {
                rtLatency = UNITS / 30;
            }
            bool bShouldDeliver = false;
            do
            {
                if (m_dwAdviseToken == 0)
                {
                    m_pClock.GetTime(out m_rtClockStart);
                    hr = (HRESULT)m_pClock.AdvisePeriodic(m_rtClockStart + rtLatency, rtLatency, m_hSemaphore.Handle, out m_dwAdviseToken);
                    hr.Assert();
                }
                else
                {
                    if (!m_hSemaphore.WaitOne())
                    {
                        ASSERT(FALSE);
                    }
                }
                bShouldDeliver = TRUE;
                _start = m_rtStart;
                _stop = m_rtStart + 1;
                _sample.SetTime(_start, _stop);
                hr = (HRESULT)(m_Filter as VirtualCamFilter).FillBuffer(ref _sample); // <-----------
                if (FAILED(hr) || S_FALSE == hr) return hr;
 
                m_pClock.GetTime(out m_rtClockStop);
                _sample.GetTime(out _start, out _stop);
                
                if (rtLatency > 0 && rtLatency * 3 < m_rtClockStop - m_rtClockStart)
                {
                    m_rtClockStop = m_rtClockStart + rtLatency;
                }
                _stop = _start + (m_rtClockStop - m_rtClockStart);
                m_rtStart = _stop;
                lock (m_csPinLock)
                {
                    _start -= m_rtStreamOffset;
                    _stop -= m_rtStreamOffset;
                }
                _sample.SetTime(_start, _stop);
                m_rtClockStart = m_rtClockStop;
 
                bShouldDeliver = ((_start >= 0) && (_stop >= 0));
 
                if (bShouldDeliver)
                {
                    lock (m_csPinLock)
                        if (m_rtStartAt != -1)
                        {
                            if (m_rtStartAt > _start)
                            {
                                bShouldDeliver = FALSE;
                            }
                            else
                            {
                                if (m_dwStartCookie != 0 && !m_bStartNotified)
                                {
                                    m_bStartNotified = TRUE;
                                    hr = (HRESULT)m_Filter.NotifyEvent(EventCode.StreamControlStarted, Marshal.GetIUnknownForObject(this), (IntPtr)m_dwStartCookie);
                                    if (FAILED(hr)) return hr;
                                }
                            }
                        }
                    if (!bShouldDeliver) continue;
                    if (m_rtStopAt != -1)
                    {
                        if (m_rtStopAt < _start)
                        {
                            if (!m_bStopNotified)
                            {
                                m_bStopNotified = TRUE;
                                if (m_dwStopCookie != 0)
                                {
                                    hr = (HRESULT)m_Filter.NotifyEvent(EventCode.StreamControlStopped, Marshal.GetIUnknownForObject(this), (IntPtr)m_dwStopCookie);
                                    if (FAILED(hr)) return hr;
                                }
                                bShouldDeliver = m_bShouldFlush;
                            }
                            else
                            {
                                bShouldDeliver = FALSE;
                            }
                            // EOS
                            if (!bShouldDeliver) return S_FALSE;
                        }
                    }
                }
            }
            while (!bShouldDeliver);
 
            return NOERROR;
        }

Который, в процессе выполнения вызывает метод для заполнения, из класса фильтра VirtualCamFilter.FillBuffer
Кликните здесь для просмотра всего текста
C#
1
hr = (HRESULT)(m_Filter as VirtualCamFilter).FillBuffer(ref _sample);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int FillBuffer(ref IMediaSampleImpl _sample)
        {
            if (m_hBitmap == IntPtr.Zero)
            {
                m_hBitmap = CreateCompatibleBitmap(m_hScreenDC, m_nWidth, Math.Abs(m_nHeight));
            }
            IntPtr _ptr;
            _sample.GetPointer(out _ptr);
 
            IntPtr hOldBitmap = SelectObject(m_hMemDC, m_hBitmap);
 
            StretchBlt(m_hMemDC, 0, 0, m_nWidth, Math.Abs(m_nHeight), m_hScreenDC, 0, 0, m_nMaxWidth, m_nMaxHeight,TernaryRasterOperations.SRCCOPY);
 
            SelectObject(m_hMemDC, hOldBitmap);
 
            GetDIBits(m_hMemDC, m_hBitmap, 0, (uint)Math.Abs(m_nHeight), _ptr, ref m_bmi, 0); // <-----------
 
            _sample.SetActualDataLength(_sample.GetSize());
            _sample.SetSyncPoint(true);
            return NOERROR;
        }

И вот, после вызова всего этого счастья, мы дёргаем член библиотеки gdi32 GetDIBits
Кликните здесь для просмотра всего текста
C#
1
GetDIBits(m_hMemDC, m_hBitmap, 0, (uint)Math.Abs(m_nHeight), _ptr, ref m_bmi, 0);

Функция забирает "текущую картинку" из устройства и суёт её в буфур.(ну если я нечего не путаю)
А теперь вопрос: Если у меня есть видео файл. Сторонней библиотекой я разобью его на фреймы (на битмапы), как мне эти кадры засунуть в указатель _ptr (я так понял что, мне именно в указатель нужно засовывать, т.к. отладив код я увидел что ссылка всегда есть, а переменная со специальной структурой m_bmi всегда пуста (массив "Соlors" всегда пуст. Шапку мы в конструкторе проекта мануально задали уже))??
Вариантами ответа могут быть как другие C++ функции которые я импортну и буду дёргать для заполнения, так и возможно функции шарма (если кто-то знает как раскладывается, ранее упомянутый член, из библиотеки gdi32 и как его на шарпе интерпретировать).

Развязка.
...будет завтра утром! Мне на завтро нужно решить этот пустяк. Я всю ночь буду работать. Кто захочет что-то переспросить или как-то помочь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2016, 22:21
Ответы с готовыми решениями:

Нужно написать аналог функции pred('B') в С++
Нужно вывести предыдущее значение В в С++

Нужно найти аналог материнки
Друзья,помогите найти аналог платы от ноутбука Samsung np300e5z. Аналог нужен с поддержкой...

Нужно найти бесплатный аналог программы для логистов packer3d
Здравствуйте! Помогите, пожалуйста, очень нужно найти бесплатный аналог программы для логистов...

Нужно найти аналог (поиск решения) средствами VBA или формул
Всем привет! Поиском решения я столкнулся с 2 причинами. оно сейчас в примере работает все...

Не могу найти аналог функции setPeerVerifyName в ssl
В общем мне надо подключится к сайту через прокси на сокетах, с прокси соединился, а вот обмен...

19
Croessmah
15.02.2016, 01:13
  #2
 Комментарий модератора 
Ознакомьтесь с правилами форума
Обсуждение вопросов - только в теме на форуме. Приглашения к обсуждению еще где-либо (в том числе и с помощью системы личных сообщений) запрещены, за исключением коммерческих разделов.
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
15.02.2016, 07:02  [ТС] 3
Люди, вы что, спите?))

Так, у меня сдвиг и по сути говоря вопрос (основной) который задан "темой" - решён!
Функция из той же библиотечки GetBitmapBits
Я её сразу просто не рассмотрел.

Остался ещё косяк. Всё вот ковыряюсь, не найду что да как его решить, по этому продолжаю подкидывать вопросы.

Эта функция принимает указатель на битмап (тут просто, у .net-овского класса есть метод для его получения)
...
Последний параметр это указатель "куда" записывать, он у нас был изначально!
...второй параметр - размер буфера, я фиг его.. чего конкретно это размер? Размер конечной точки назначения или размер файла который мы заливаем?
Сейчас точно видно что картинка передаётся! (цветовая гамма видна!) Проблема в том что она как то спрессована... по ширение "фулл", а высота страдает. Ещё не разобрался почему! Кто хочет подключайтесь!

Добавлено через 2 часа 57 минут
Текущее состояние:

Не могу с масштабированием закончить.

1. Функцию которую в предыдущем коменте описал - не юзаю. Достаточно в исходном коде заменить хендл битмапа (2й параметр) в функции GetDIBits. Работает, но без масштабирования при ресайзе окна рендринга.
2. Разобрал что копирование картинки рабочего стола происходит в функции. StretchBlt. К сожалению эта функция копирует только из "дивайс контекста в дивайс контекст". Нашёл похожую StretchDIBits, она в контекст копирует массив байт. Параметры (ну мне так кажется) выставил верно. ИмелджКонвертеров(стандартный дотнетовский класс) преобразовал битмап в массив байт. Функция возвращает - 0 (что говорит об ошибке). В чём дело пока что не разберу.

Слушаю Adele
Пошёл готовить пельмешки

Добавлено через 14 минут
Закину немного кода, пока пельмешки варятся.
C#
1
2
3
4
5
 [DllImport("gdi32.dll")]
        static extern int StretchDIBits(IntPtr hdc, int XDest, int YDest,
        int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth,
        int nSrcHeight, byte[] lpBits, [In] ref BitmapInfo lpBitsInfo, uint iUsage,
        uint dwRop);
C#
1
2
static Bitmap bmp1= new Bitmap(@"C:\123.jpg");
        IntPtr bmp = bmp1.GetHbitmap();
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
public int FillBuffer(ref IMediaSampleImpl _sample)
        {
            if (m_hBitmap == IntPtr.Zero)
            {
                m_hBitmap = CreateCompatibleBitmap(m_hScreenDC, m_nWidth, Math.Abs(m_nHeight));
            }
            IntPtr _ptr;
            _sample.GetPointer(out _ptr);
 
            IntPtr hOldBitmap = SelectObject(m_hMemDC, m_hBitmap);
            
            ImageConverter converter = new ImageConverter();
 
            //StretchBlt(m_hMemDC, 0, 0, m_nWidth, Math.Abs(m_nHeight), m_hScreenDC, 0, 0, m_nMaxWidth, m_nMaxHeight, TernaryRasterOperations.SRCCOPY);
            int a  = StretchDIBits(m_hMemDC, 0, 0, m_nWidth, Math.Abs(m_nHeight), 0, 0, bmp1.Width, bmp1.Height,
                (byte[])converter.ConvertTo(bmp1, typeof(byte[])), ref m_bmi, 0, 0x00CC0020); //TernaryRasterOperations.SRCCOPY);
 
            SelectObject(m_hMemDC, hOldBitmap);
 
            GetDIBits(m_hMemDC, m_hBitmap, 0, (uint)Math.Abs(m_nHeight), _ptr, ref m_bmi, 0);
 
            _sample.SetActualDataLength(_sample.GetSize());
            _sample.SetSyncPoint(true);
            return NOERROR;
        }
и "а", к сожалению 0 развращает ;(
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.02.2016, 11:01 4
DarkOrk,
...второй параметр - размер буфера, я фиг его.. чего конкретно это размер? Размер конечной точки назначения или размер файла который мы заливаем?
просто width*height*pixel_in_bytes + служебная информация. Для оценки можно воспользоваться таким говнокодом
C#
1
2
3
4
5
6
7
8
public static long GetImageSize(Image image, ImageFormat format)
{
    using (MemoryStream ms = new MemoryStream())
    {
        image.Save(ms, format);
        return ms.Length;
    }
}
С другой стороны, все кадры оформляют одно видео, значит можно посчитать это только для одного первого кадра, а для всех остальных брать размер буфера того же размера. Тогда получится не затратно.

Добавлено через 1 минуту
DarkOrk, и зачем создавать тему по шарпу в плюсах я тоже не понял. Если бы не дубликат в C# я бы сюда и не зашел.
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
15.02.2016, 11:59  [ТС] 5
Ну тогда в обратом порядке, - топик в плюсах потому что основная загвоздка в плюсовых функциях. Тут весь проект, одна большая обвертка для плюсов. Вот я и подумал что "плюсовые ребята" помогут больше Не в обиду "нашим" ))

От этой функции, как я выше писал я отказался из за ненадобности. Но всё равно "спс" буду впредь знать что это такое.

-----------
Радость моя была не долгая ;( Подумал что закончил и тут... тест не пройден...

И вот вопрос для "плюсовых ребят". Я не знаю как, но я умудрился устроить полноценный "мемори лик"!! Я крут!))

Как не странно, я только прибрал лишний код и добавил шарповскую обработку (без всякого маршалинга в плюсы). Ошибка летит на очередном (n-ом) дёрганье функции GetDIBits. Как-то можно (или нужно?) чистить объекты связанные с ней??
Текст ошибки "Недостаточно памяти" (ну, а потом (если проигнорить) всякая бредятина... "Общая ошибка GDI+" и "Неправильный вызов функции"...).
И да, как будет видно в ниже приведённом коде, вопрос масштабирования я решил без плюсов))) Подумал "а чего бы с другой стороны не подойти", - "можно же битмап, прям в шарпе, растянуть!"

C#
1
2
3
private VideoFileReader reader = new VideoFileReader(); //первый раз я опен файла вызываю в специальной функции-ивенте, при старте работы
        private int tc = 0;
        private Size bSize = new Size();
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
      
        public int FillBuffer(ref IMediaSampleImpl _sample)
        {
            IntPtr _ptr;
            _sample.GetPointer(out _ptr);
 
            Bitmap videoFrame = reader.ReadVideoFrame();
            try
            {
               if (videoFrame == null) //Эт временная заглушка, что бы "фильм никогда не кончался!"
                {
                    reader.Close();
                    reader.Open(@"C:\123.wmv");
                    videoFrame = reader.ReadVideoFrame();
                }
                bSize.Width = m_nWidth;
                bSize.Height = Math.Abs(m_nHeight);
                Bitmap bmp = new Bitmap(videoFrame, bSize); //а вот и решение с масштабированием
 
 
                GetDIBits(m_hMemDC, bmp.GetHbitmap(), 0, (uint) Math.Abs(m_nHeight), _ptr, ref m_bmi, 0); //<---вот тут летит ;(
                Interlocked.Increment(ref tc);
            }
            catch(Exception exc)
            {
 
                MessageBox(new IntPtr(0), exc.Message, tc.ToString(), 0);
 
            }
            finally
            {
                if (videoFrame != null)
                    videoFrame.Dispose();
            }
 
            _sample.SetActualDataLength(_sample.GetSize());
            _sample.SetSyncPoint(true);
 
            return NOERROR;
        }
Что делать? Как чистить? Что чистить?))
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
15.02.2016, 19:46 6
Цитата Сообщение от DarkOrk Посмотреть сообщение
мемори лик
Так вы New вызываете, а где delete ?

И вообще, WinApi это логичное программирование, а то что вы показываете, это странности за странностями. Например:
C++
1
MessageBox(new IntPtr(0), exc.Message, tc.ToString(), 0);
Зачем тут New? Тут должен быть NULL (основное окно) либо окно, которое должно быть главным.
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
15.02.2016, 20:28  [ТС] 7
Ну по поводу "месадж бокса" это я с примером взял. Ок, - "можно null?" заменим на null.


А где это я New вызываю без вызова delete? (вы бы лучше это цитатой вставили, а не меседжБокс(он то и так в глаза бросается)). Где new без delete????????

Добавлено через 1 минуту
Хоть и битмап для масштабирования вызывается в самом конце блока, я его уже и в юзинг завернул (ну на всяк случай; просто к слову)

Добавлено через 10 минут
Во всём представленном методе, оператор new вызывается всего 2 раза!
1. в месадж боксе (там уже убрал, раз можно и без него. Спс за ваше уточнение)
2. при создании битмапа для масштабирования, но тут, как бы:
-это элемент управляемой части кода. Тут его gc сам прибьёт.
-если вы вдруг подумали что это код из C++ то - нет. Т.к. это код C# то элемент и память для элемента выдяляеться в приделах блока кода в котором он находиться, то есть битмап прибивается после каждого "копирования в DC" и завершения блока.
-я его, уже, завернул в using (что ведёт к вызову dispose)

Добавлено через 10 минут
Izual, нуууу.... ;( где я delete не вызвал? я не вижу.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.02.2016, 21:49 8
Izual, new IntPtr(0) это и есть Null, хотя лучше конечно использовать IntPtr.Zero.
А вообще нужно понимать, кто отвечает за ресурсы (вызывающий код или вызываемый), кто должен очищать память и т.п.
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
15.02.2016, 22:23  [ТС] 9
Psilon, Эт хорошо))) А догадки где я память теряю, есть??? Как то очищать ресурсы GetDIBits нужно?

Добавлено через 3 минуты
Может Нид как-то очищать контекст, который я заполняю битмапом??
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
15.02.2016, 22:27 10
Цитата Сообщение от DarkOrk Посмотреть сообщение
Bitmap bmp = new Bitmap(videoFrame, bSize);
Здесь New есть, а где delete?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.02.2016, 23:16 11
DarkOrk, как выше уже сказали, Как минимум битмапы не диспозятся. Еще unmanaged heap может расти, потому что интеропятся винапишные методы, если где-то используется класс Marshal, то нужно корреткно освобождать ресурсы. И убедиться, что на стороне С++ все почищено.
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
16.02.2016, 00:37  [ТС] 12
Цитата Сообщение от Izual Посмотреть сообщение
Здесь New есть, а где delete?
УЖЕ ответил
Цитата Сообщение от DarkOrk Посмотреть сообщение
-я его, уже, завернул в using (что ведёт к вызову dispose)
маршал используется, но автору "можно верить", т.к. в его варианте всё работало. Я только входной битмап заменил (по сути то). В общих чертах "до моего изменения" всё работало и не летело. Исходный код у вас есть, мой вариант - тоже.
Единственное что... я с этой функцией не работал и тонкостей не знаю. В оригинале юзалась вин апишная функция "селектОбджект" может с этим связано?
На мсдне написано что она подменяет один экземпляр одного типа на другой... но как она работает я не совсем понял=(((
Может в ней дело? Она юзалась, а у себя её я снёс.

не поймо бле
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
16.02.2016, 01:04 13
Цитата Сообщение от DarkOrk Посмотреть сообщение
УЖЕ ответил
Разговор с Псилоном был о new в MessageBox'e, но не о bitmap элементе, который и утекает. Если С# использует точно такой же режим работы new и delete, то завершение блока скобками - не освобождает память выделенную через new. Либо объект битмапа создавайте статически и он сам удалится, либо в связке юзать new и delete.
И даже если юзать статический метод, то один фиг надо освобождать объект DeleteObject(hBmp); где HBITMAP hBmp
1
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
16.02.2016, 02:00  [ТС] 14
Izual, чувак! На будущее - меньше гонора! у тебя подход объяснения хреновый!
НО СПАСИБО!!
У нас в шарпе всё само собой чиститься. Но видимо когда ты хендел битмапа получаешь - он не освобождается. И из за него!
Цитата Сообщение от Izual Посмотреть сообщение
DeleteObject(hBmp);
Да! Помогло! Спасибо!! Пошёл заканчивать проект!! Спс!
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
16.02.2016, 02:18 15
Цитата Сообщение от DarkOrk Посмотреть сообщение
меньше гонора
В других темах я может и согласился бы. Но в данном случае с моей стороны не было ни одной оскорбительной фразы, так что {вырезано}!

Цитата Сообщение от DarkOrk Посмотреть сообщение
всё само собой чиститься
Ну вот и не само собой, как выясняется. Всё точно так же как и в плюсах. А если у вас классовые обёртки есть с удалением, то это ещё не значит что они сработают.(тут даже вопрос не в том что они не сработают, а в том что может и не войти туда, и это уже будет fatal error) Именно по этому надо не шарпы и тому подобные языки учить, а стандартный Си (даже не плюсы, т.к. под тот же new надо будет 100500 exceptions описывать, что засоряет лишним синтаксисом голову, на реальные вещи не остаётся времени для изучения и т.п.)
0
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
16.02.2016, 03:00  [ТС] 16
Задам сперва кратко этот вопрос сюда, но в целом как бы тема закрыта.

Что бы у меня всё было идеально мне над ещё заставить хавать, всё это дело - хрому!!!!
Он устройства видит, но данные не транслирует. Експловер и мазила - кушают норм!!
Кратко вопрос: какие параметры у деректШоу фильтра должны быть, что бы их хром транслировал?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2016, 10:19 17
Izual, просто нужно понимать разницу в удаляемых/неудаляемых ресурсов. Все дотнетовские классы очищаются автоматически, некоторые правда можно руками почистить, чтобы ресурсы раньше освободить (сокет там или файл), но рано или поздно сборщик все равно до них доберется, но тут есть минус из того, что если кто-то другой хочет файлом попользоваться, то нужно ждать недетерминированного закрытия хэндла.

Что касается new в мессаджбоксе, то эта конструкция создает структуру, так что по выходу из скоупа она все равно автоматически удалится

Но вот когда начинается взаимодействие с сишным кодом, за который сборщик не отвечает, у людей начинаются "чудеса" Та же история с ком-объектами.

Добавлено через 36 секунд
DarkOrk, создай новую тему со ссылкой на эту. Одна тема - один вопрос афайк. Ибо даже название уже нерелевантно.
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
16.02.2016, 10:33 18
Цитата Сообщение от Psilon Посмотреть сообщение
понимать разницу в удаляемых/неудаляемых ресурсов
Ну давай, выкладывай, как различить этот ресурс без использования справки MSDN'a, где тоже чёрт голову сломает чтоб найти что то путное.
Мне вот уже третий день в теме про FONT никто ответить не может, хотя в поисковике по кучам запросов уже сайт в топ вышел благодаря тому что я указал много важных ключевых слов. (ну это так, к слову о маркетинге^^)
Это у вас там дотнет и ещё что то, а тут чистый WinApi, т.к. раздел такой.
Цитата Сообщение от Psilon Посмотреть сообщение
у людей начинаются "чудеса"
Потому что внутренности не знают. Привыкли работать с готовыми обёртками.. Даже на этом форуме уже сотни раз поднималась тема о том, что программисты стали корявыми, большинство не умеет с указателями работать на прямую, без STL никуда - это точно так же для меня, как назвать программистом пользователей каких нибудь PHP или HTML, которые по сути то и не языки программирования, а тоже обёртки.
*Си конешно тоже обёртка от ассемблера (или чего ещё глубже), но лезть без экстра надобности в ассемблер - это уже мазахизм. Очень конешно пичально, что только 50-100 лет назад начался век техники, и уже закат.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2016, 11:42 19
Цитата Сообщение от Izual Посмотреть сообщение
Ну давай, выкладывай, как различить этот ресурс без использования справки MSDN'a, где тоже чёрт голову сломает чтоб найти что то путное.
Мне вот уже третий день в теме про FONT никто ответить не может, хотя в поисковике по кучам запросов уже сайт в топ вышел благодаря тому что я указал много важных ключевых слов. (ну это так, к слову о маркетинге^^)
Это у вас там дотнет и ещё что то, а тут чистый WinApi, т.к. раздел такой.
А как в C++ без справки понять, как управлять структурой? Нужно передавать указатель, а функция сама по этому адресу создаст структуру? Или нужно сначала создать самому нужную структуру, а функция будет её только заполнять? Кто отвечает за удаление данных?.. Все это называется calling conventions и в С/С++ точно также не решается без документации.

А в чистом шарпе всё проще. Если реализован интерфейс IDisposable - нужно освобождать ресурсы одноименным методом и утечек не будет.

Цитата Сообщение от Izual Посмотреть сообщение
Потому что внутренности не знают. Привыкли работать с готовыми обёртками.. Даже на этом форуме уже сотни раз поднималась тема о том, что программисты стали корявыми, большинство не умеет с указателями работать на прямую, без STL никуда - это точно так же для меня, как назвать программистом пользователей каких нибудь PHP или HTML, которые по сути то и не языки программирования, а тоже обёртки.
*Си конешно тоже обёртка от ассемблера (или чего ещё глубже), но лезть без экстра надобности в ассемблер - это уже мазахизм. Очень конешно пичально, что только 50-100 лет назад начался век техники, и уже закат.
А это уже вообще какие-то понты Со времен Древней Греции еще Геродот по-моему говорил, что молодеж уже не та пошла, и вообще они в свое время - о-го-го!!
Вот ты говоришь, что без экстра надобности лезть в ассемблер не надо, а кто-то так считает про С. В чем разница? А только в том, что ты программист не старой закалки, у которых такое же отношение к тем, кто не знает ассемблера, как у тебя к ТСу. А разницы тут никакой и нет "Да это совсем другой дело" просто показывает узость твоей точки зрения.
Цитата Сообщение от Izual Посмотреть сообщение
Очень конешно пичально, что только 50-100 лет назад начался век техники, и уже закат.
Миниатюры
Нужно найти "аналог" функции  
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
16.02.2016, 20:38 20
Цитата Сообщение от Psilon Посмотреть сообщение
не решается без документации
Вот об этом и речь, а ввиду этого следующяя фраза не имеет смысла:
Цитата Сообщение от Psilon Посмотреть сообщение
понимать разницу в удаляемых/неудаляемых ресурсов
Именно по этому я и саркастично задал вопрос, потому что понимание тут не имеет смысла, ты хоть будь 100 лвлом в мастерстве логики, но без справки просто ничего не поймёш, потому что сделано так, что ты ни какой логикой не додумаешся что нужно например вызвать DeleteObject.

Цитата Сообщение от Psilon Посмотреть сообщение
как управлять структурой
Ну с помощью логики обычно понятно, что если ты создаёш объект на основе какой то структуры, например LOGFONT, то ясен пень что её надо заполнить, как - вопрос другой, но то что её надо заполнить перед вызовом в основном ясно. Да и тем более, если не читать всю статью, а иметь только прототип вызова, то это становится ещё понятнее, а протототип функции обычно на МСДНе уже пишет [in] или [out], плюс само название функции обычно говорит за себя, ну и name mangling помогает иногда (если не брать прототип из МСДНа).

Цитата Сообщение от Psilon Посмотреть сообщение
какие-то понты
Это не понты, я не сказал что я умею. И смысл был не в этом, а в том что реально посмотрев даже на вакансии, везде повально знание STL, но не принципов. Т.е. профессионалов ни кто не ищет, а значит их выращивать не будут - а значит деградация в тот момент, когда надо наоборот апать мозг.
Цитата Сообщение от Psilon Посмотреть сообщение
кто-то так считает про С. В чем разница?
Как там пишется про языки программирования (точно не помню), но там они различаются, и Си уже является языком "для человека", он то по сути так и сделан на основе ассемблера, потому что тот уже машинного уровня.
Разница есть, огромная, в мозгах и возможности их использования.

А картинка не к месту, не надо вот экстримизма, и 500 лет назад было хуже, все эти так называемые "золотые, серебрянные века" и т.п. - мракобесие сплошное (сейчас маразм конешно тоже развился до неимоверных высот), сравнивать людей тех веков, которые и 10% не знали (полезного) того что знает сейчас хорошо учащийся школьник. КПД вырос в целом для тех кто мозгами интересуется. Но вот ситуация когда только только создали казалось бы инструменты для создания мира, где ты можеш сочёк попивать, а машины будут всё делать за тебя - и эту же идею сами затоптали.. Зачем, почему?.. Очень всё странно это. Я конешно понимаю, что для тех кто мозги не использует - вообще ад, т.к. безработица, но матерриальный мир для того и создан, чтоб показать что ручной труд по сути - второстепенное. (мозг, как ум, тоже не на первом месте, но приоритетнее чем мускулы)
0
16.02.2016, 20:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2016, 20:38
Помогаю со студенческими работами здесь

Нужно построить график функции, найти максимальное и минимальное значение функции на заданном
Напишите файл-программу (M-file), которая должна: построить график функции, найти максимальное и...

Нужно найти предел функции
Нужно найти предел функции без правила Лопиталя Помогите пожалуйста

Нужно найти производную функции
найти производную функции f(x)=(x^3)-x-cosx по определению (принимая дельта х=0,001) в точках из...

Нужно найти лимит функции
Нужно найти лимит функции \lim_{x\to\infty}\left(1+\frac{x}{2^x}\right)^{\frac{2x}{x}} Решение:...

Нужно найти производную параметрической функции.
решите пожалуйста


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru