20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Нужно найти "аналог" функции14.02.2016, 22:21. Показов 1209. Ответов 19
Метки нет (Все метки)
Экспозиция.
Код который я буду приводить написан на 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 Кликните здесь для просмотра всего текста
Который, в процессе выполнения вызывает метод для заполнения, из класса фильтра VirtualCamFilter.FillBuffer Кликните здесь для просмотра всего текста
И вот, после вызова всего этого счастья, мы дёргаем член библиотеки gdi32 GetDIBits Кликните здесь для просмотра всего текста
Функция забирает "текущую картинку" из устройства и суёт её в буфур.(ну если я нечего не путаю) А теперь вопрос: Если у меня есть видео файл. Сторонней библиотекой я разобью его на фреймы (на битмапы), как мне эти кадры засунуть в указатель _ptr (я так понял что, мне именно в указатель нужно засовывать, т.к. отладив код я увидел что ссылка всегда есть, а переменная со специальной структурой m_bmi всегда пуста (массив "Соlors" всегда пуст. Шапку мы в конструкторе проекта мануально задали уже))?? Вариантами ответа могут быть как другие C++ функции которые я импортну и буду дёргать для заполнения, так и возможно функции шарма (если кто-то знает как раскладывается, ранее упомянутый член, из библиотеки gdi32 и как его на шарпе интерпретировать). Развязка. ...будет завтра утром! Мне на завтро нужно решить этот пустяк. Я всю ночь буду работать. Кто захочет что-то переспросить или как-то помочь.
0
|
14.02.2016, 22:21 | |
Ответы с готовыми решениями:
19
Нужно написать аналог функции pred('B') в С++ Нужно найти аналог материнки Нужно найти бесплатный аналог программы для логистов packer3d Нужно найти аналог (поиск решения) средствами VBA или формул Не могу найти аналог функции setPeerVerifyName в ssl |
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 минут Закину немного кода, пока пельмешки варятся.
0
|
Master of Orion
|
||||||
15.02.2016, 11:01 | 4 | |||||
DarkOrk,
Добавлено через 1 минуту DarkOrk, и зачем создавать тему по шарпу в плюсах я тоже не понял. Если бы не дубликат в C# я бы сюда и не зашел.
0
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|||||||||||
15.02.2016, 11:59 [ТС] | 5 | ||||||||||
Ну тогда в обратом порядке, - топик в плюсах потому что основная загвоздка в плюсовых функциях. Тут весь проект, одна большая обвертка для плюсов. Вот я и подумал что "плюсовые ребята" помогут больше Не в обиду "нашим" ))
От этой функции, как я выше писал я отказался из за ненадобности. Но всё равно "спс" буду впредь знать что это такое. ----------- Радость моя была не долгая ;( Подумал что закончил и тут... тест не пройден... И вот вопрос для "плюсовых ребят". Я не знаю как, но я умудрился устроить полноценный "мемори лик"!! Я крут!)) Как не странно, я только прибрал лишний код и добавил шарповскую обработку (без всякого маршалинга в плюсы). Ошибка летит на очередном (n-ом) дёрганье функции GetDIBits. Как-то можно (или нужно?) чистить объекты связанные с ней?? Текст ошибки "Недостаточно памяти" (ну, а потом (если проигнорить) всякая бредятина... "Общая ошибка GDI+" и "Неправильный вызов функции"...). И да, как будет видно в ниже приведённом коде, вопрос масштабирования я решил без плюсов))) Подумал "а чего бы с другой стороны не подойти", - "можно же битмап, прям в шарпе, растянуть!"
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
15.02.2016, 19:46 | 6 | |||||
Так вы New вызываете, а где delete ?
И вообще, WinApi это логичное программирование, а то что вы показываете, это странности за странностями. Например:
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
|
|
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 |
0
|
Master of Orion
|
|
15.02.2016, 23:16 | 11 |
DarkOrk, как выше уже сказали, Как минимум битмапы не диспозятся. Еще unmanaged heap может расти, потому что интеропятся винапишные методы, если где-то используется класс Marshal, то нужно корреткно освобождать ресурсы. И убедиться, что на стороне С++ все почищено.
0
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
16.02.2016, 00:37 [ТС] | 12 |
УЖЕ ответил
маршал используется, но автору "можно верить", т.к. в его варианте всё работало. Я только входной битмап заменил (по сути то). В общих чертах "до моего изменения" всё работало и не летело. Исходный код у вас есть, мой вариант - тоже. Единственное что... я с этой функцией не работал и тонкостей не знаю. В оригинале юзалась вин апишная функция "селектОбджект" может с этим связано? На мсдне написано что она подменяет один экземпляр одного типа на другой... но как она работает я не совсем понял=((( Может в ней дело? Она юзалась, а у себя её я снёс. не поймо бле
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
16.02.2016, 01:04 | 13 |
Разговор с Псилоном был о 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, чувак! На будущее - меньше гонора! у тебя подход объяснения хреновый!
НО СПАСИБО!! У нас в шарпе всё само собой чиститься. Но видимо когда ты хендел битмапа получаешь - он не освобождается. И из за него! Да! Помогло! Спасибо!! Пошёл заканчивать проект!! Спс!
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
16.02.2016, 02:18 | 15 |
В других темах я может и согласился бы. Но в данном случае с моей стороны не было ни одной оскорбительной фразы, так что {вырезано}!
Ну вот и не само собой, как выясняется. Всё точно так же как и в плюсах. А если у вас классовые обёртки есть с удалением, то это ещё не значит что они сработают.(тут даже вопрос не в том что они не сработают, а в том что может и не войти туда, и это уже будет fatal error) Именно по этому надо не шарпы и тому подобные языки учить, а стандартный Си (даже не плюсы, т.к. под тот же new надо будет 100500 exceptions описывать, что засоряет лишним синтаксисом голову, на реальные вещи не остаётся времени для изучения и т.п.)
0
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
16.02.2016, 03:00 [ТС] | 16 |
Задам сперва кратко этот вопрос сюда, но в целом как бы тема закрыта.
Что бы у меня всё было идеально мне над ещё заставить хавать, всё это дело - хрому!!!! Он устройства видит, но данные не транслирует. Експловер и мазила - кушают норм!! Кратко вопрос: какие параметры у деректШоу фильтра должны быть, что бы их хром транслировал?
0
|
Master of Orion
|
|
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 |
Ну давай, выкладывай, как различить этот ресурс без использования справки MSDN'a, где тоже чёрт голову сломает чтоб найти что то путное.
Мне вот уже третий день в теме про FONT никто ответить не может, хотя в поисковике по кучам запросов уже сайт в топ вышел благодаря тому что я указал много важных ключевых слов. (ну это так, к слову о маркетинге^^) Это у вас там дотнет и ещё что то, а тут чистый WinApi, т.к. раздел такой. Потому что внутренности не знают. Привыкли работать с готовыми обёртками.. Даже на этом форуме уже сотни раз поднималась тема о том, что программисты стали корявыми, большинство не умеет с указателями работать на прямую, без STL никуда - это точно так же для меня, как назвать программистом пользователей каких нибудь PHP или HTML, которые по сути то и не языки программирования, а тоже обёртки. *Си конешно тоже обёртка от ассемблера (или чего ещё глубже), но лезть без экстра надобности в ассемблер - это уже мазахизм. Очень конешно пичально, что только 50-100 лет назад начался век техники, и уже закат.
0
|
Master of Orion
|
|
16.02.2016, 11:42 | 19 |
А как в C++ без справки понять, как управлять структурой? Нужно передавать указатель, а функция сама по этому адресу создаст структуру? Или нужно сначала создать самому нужную структуру, а функция будет её только заполнять? Кто отвечает за удаление данных?.. Все это называется calling conventions и в С/С++ точно также не решается без документации.
А в чистом шарпе всё проще. Если реализован интерфейс IDisposable - нужно освобождать ресурсы одноименным методом и утечек не будет. А это уже вообще какие-то понты Со времен Древней Греции еще Геродот по-моему говорил, что молодеж уже не та пошла, и вообще они в свое время - о-го-го!! Вот ты говоришь, что без экстра надобности лезть в ассемблер не надо, а кто-то так считает про С. В чем разница? А только в том, что ты программист не старой закалки, у которых такое же отношение к тем, кто не знает ассемблера, как у тебя к ТСу. А разницы тут никакой и нет "Да это совсем другой дело" просто показывает узость твоей точки зрения.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
16.02.2016, 20:38 | 20 |
Вот об этом и речь, а ввиду этого следующяя фраза не имеет смысла:
Именно по этому я и саркастично задал вопрос, потому что понимание тут не имеет смысла, ты хоть будь 100 лвлом в мастерстве логики, но без справки просто ничего не поймёш, потому что сделано так, что ты ни какой логикой не додумаешся что нужно например вызвать DeleteObject. Ну с помощью логики обычно понятно, что если ты создаёш объект на основе какой то структуры, например LOGFONT, то ясен пень что её надо заполнить, как - вопрос другой, но то что её надо заполнить перед вызовом в основном ясно. Да и тем более, если не читать всю статью, а иметь только прототип вызова, то это становится ещё понятнее, а протототип функции обычно на МСДНе уже пишет [in] или [out], плюс само название функции обычно говорит за себя, ну и name mangling помогает иногда (если не брать прототип из МСДНа). Это не понты, я не сказал что я умею. И смысл был не в этом, а в том что реально посмотрев даже на вакансии, везде повально знание STL, но не принципов. Т.е. профессионалов ни кто не ищет, а значит их выращивать не будут - а значит деградация в тот момент, когда надо наоборот апать мозг. Как там пишется про языки программирования (точно не помню), но там они различаются, и Си уже является языком "для человека", он то по сути так и сделан на основе ассемблера, потому что тот уже машинного уровня. Разница есть, огромная, в мозгах и возможности их использования. А картинка не к месту, не надо вот экстримизма, и 500 лет назад было хуже, все эти так называемые "золотые, серебрянные века" и т.п. - мракобесие сплошное (сейчас маразм конешно тоже развился до неимоверных высот), сравнивать людей тех веков, которые и 10% не знали (полезного) того что знает сейчас хорошо учащийся школьник. КПД вырос в целом для тех кто мозгами интересуется. Но вот ситуация когда только только создали казалось бы инструменты для создания мира, где ты можеш сочёк попивать, а машины будут всё делать за тебя - и эту же идею сами затоптали.. Зачем, почему?.. Очень всё странно это. Я конешно понимаю, что для тех кто мозги не использует - вообще ад, т.к. безработица, но матерриальный мир для того и создан, чтоб показать что ручной труд по сути - второстепенное. (мозг, как ум, тоже не на первом месте, но приоритетнее чем мускулы)
0
|
16.02.2016, 20:38 | |
16.02.2016, 20:38 | |
Помогаю со студенческими работами здесь
20
Нужно построить график функции, найти максимальное и минимальное значение функции на заданном Нужно найти предел функции Нужно найти производную функции Нужно найти лимит функции Нужно найти производную параметрической функции. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |