Привет, эммм не совсем понятно, так на (в) чём ты хочешь их делать? MFC или таки на С#? Если последнее, то Windows Forms? WPF?
зы я понимаю, что вопрос задан в теме MFC, но всё-таки
Форум программистов «Весельчак У» |
|
Начало | Помощь | Поиск | Календарь | Почта | Войти | Регистрация |
51
: 12-01-2025 03:47
|
||
Автор Boriska - Последний ответ от Джон | ||
Привет, эммм не совсем понятно, так на (в) чём ты хочешь их делать? MFC или таки на С#? Если последнее, то Windows Forms? WPF?
зы я понимаю, что вопрос задан в теме MFC, но всё-таки |
52
: 11-01-2025 10:30
|
||
Автор Boriska - Последний ответ от Boriska | ||
Привет ув. форумчане.
Пишу программы на MFC и на С#. Когда то хотел сделать на MFC (API) свой контрол, ничего не вышло. На С# делал, но это были только прямоугольные контролы как сумма базовых. Подскажите куда рыть-копать чтобы разобраться как можно делать окна (контролы) произвольной формы, цвета, поведения и т.д. Если я чего то накалякал не того, исправьте мой опус чтобы постановка задачи стала правильной. |
53
: 10-01-2025 15:38
|
||
Автор WWX - Последний ответ от Ochkarik | ||
WWX, Если переменная объявлена в теле функции - она размещается в стеке (текущего контекста - читай процесса).
А стек.... хороший вопрос.... Стек процесса наверное должен быть в несвопируемой области. По крайней мере пока процесс активен. Тем более он обычно небольшой, три страницы всего... Using the Kernel Stack да, вроде пишут что при активном процессе - его стек в памяти. в неактивном - может быть выгружен, но это можно отключить при помощи KeSetKernelStackSwapEnable(). еще вот тут пишут про флаг какой то Disable paging of kernel stacks - FLG_DISABLE_PAGE_KERNEL_STACKS . видимо это какой то флаг, только непонятно чего. процесса наверное? и наверное это не очень хорошая практика. Цитата Stack swapping can occur only if the thread is in a wait state that was caused by a request from a user-mode application. Stack swapping never occurs for wait states that are initiated by kernel-mode components, regardless of whether stack swapping is enabled. |
54
: 10-01-2025 14:45
|
||
Автор WWX - Последний ответ от WWX | ||
Ух, большое спасибо за развёрнутый ответ.
Я не указал, что перед этой ф-цией у него стоит директива: Код: (C++) #pragma LOCKEDCODE чем по идее и обеспечивается невыгружаемость; но, похоже, сути дела это не меняет.На самом деле эта ф-ция, говоря простым языком, – обработчик IOCTL'ов и вызывается, как я понимаю, на уровне PASSIVE_LEVEL. Т. е. с одной стороны когда управление "проходит" по этому (PAGED_CODE) макросу – IRQL не слишком высокий, но ненадолго повысится вдальнейшем внутри этой ф-ции. (Похоже что, почти нашёл почти ошибку у самого Они.) Как я понял по вашим ссылкам, по-умолчанию ф-ция и так размещается в неперемещаемой памяти, если не указывать чего-то вроде: Код: (C) #pragma alloc_text(PAGE, DispatchControl) Правда у меня возникла небольшая параноя: Если переменная oldirql (в которой сохраняется старый IRQL) объявлена как локальная в этой (DispatchControl) ф-ции (а где бы ей ещё быть?), так вот, если она объявлена как локальная, то может ли так получиться, что на момент вызова Код: (C++) KeReleaseSpinLock(..., oldirql); она (переменная) будет выгружена из памяти?Т. е. сама ф-ция вроде бы помещается в .text который будет гарантированно в невыгружаемой памяти. А есть ли гарантия, что её локальные данные также будут в невыгружаемой памяти? (Ведь на момент вызова KeReleaseSpinLock – IRQL должен быть DISPATCH_LEVEL.) |
55
: 10-01-2025 12:01
|
||
Автор WWX - Последний ответ от Ochkarik | ||
доброго!
Вообще этого не корректно. в смысле макрос проверки PAGED_CODE() поставлен некорректно... PAGED_CODE — это контроль того, что функция выполняется на IRQL < DISPATCH_LEVEL, это работает только в checked-версии. просто немного упрощает отлов ошибок, связанных с выполнением кода на недопустимо высоком IRQL. Ну и вообще код более читабельный, видим макрос в начале функции, и ясно, что на DISPATCH_LEVEL ее вызывать не надо. А главное при компиляции необходимо указать, что функцию DispatchControl() необходимо разместить в nonpaged секции (.text называлась). Делал при помощи #pragma: Код: (C) #pragma alloc_text(INIT, DriverEntry) последний - как раз размещение функции обработчика прерывания HwInt_01( IN PKINTERRUPT Interrupt, IN PDEVICE_EXTENSION_MY devExt) в nonpaged секции(.text).#pragma alloc_text(PAGE, DriverUnload) #pragma alloc_text(PAGE, AddDevice) #pragma alloc_text(PAGE, DispatchSystemControl) #pragma alloc_text(PAGE, CommonDispatch) #pragma alloc_text(TEXT, HwInt_01) ну и в ключах линкера необходимо так же указать слияние секций... Код: -MERGE:_PAGE=PAGE -MERGE:_TEXT=.text -SECTION:INIT,d вот тут чуть подробнее наверное Блокировка страничного кода или данных на microsoft.com ЗЫ Making Drivers Pageable Цитата By default, the linker assigns names such as ".text" and ".data" to the code and data sections of a driver image file. When the driver is loaded, the I/O manager makes these sections nonpaged. A nonpaged section is always memory-resident. ЗЗЫ Locking Pageable Code or DataЦитата To isolate the pageable code into a named section, mark it with the following compiler directive: #pragma alloc_text(PAGE*Xxx, *RoutineName) The name of a pageable code section must start with the four letters "PAGE" and can be followed by up to four characters (represented here as Xxx) to uniquely identify the section. The first four letters of the section name (that is, "PAGE") must be capitalized. The RoutineName identifies an entry point to be included in the pageable section. |
56
: 09-01-2025 21:15
|
||
Автор mikkijon - Последний ответ от mikkijon | ||
Приветствую Друзья И снова обращаюсь к Вам за помощью. Так как опять запутался по хождению нашей всемирной сети...... Суть проблемы в следующем... Я изучаю "Оконные приложения Python 3 и PyQt6", автор Прохорёнок Н.А. и Дронов В.А. Пройдя три главы а именно:Глава 18.9. - Вывод заставки Глава 19.5. - Разворачивание и сворачивание окон Глава 19.6. - Управление прозрачностью окна Я решил соединить листинги из этих глав.... Код: (Python) from PyQt6 import QtCore, QtWidgets, QtGui Все получилось кроме заставки..... окно появляется и тут же исчезает (также высылаю Вам сам программу)import time class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.btnMin = QtWidgets.QPushButton("Свернуть") self.btnMax = QtWidgets.QPushButton("Развернуть") self.btnFull = QtWidgets.QPushButton("Полный экран") self.btnNormal = QtWidgets.QPushButton("Нормальный размер") vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.btnMin) vbox.addWidget(self.btnMax) vbox.addWidget(self.btnFull) vbox.addWidget(self.btnNormal) self.setLayout(vbox) self.btnMin.clicked.connect(self.on_min) self.btnMax.clicked.connect(self.on_max) self.btnFull.clicked.connect(self.on_full) self.btnNormal.clicked.connect(self.on_normal) def on_min(self): self.showMinimized() def on_max(self): self.showMaximized() def on_full(self): self.showFullScreen() def on_normal(self): self.showNormal() def load_data(self, ap): for i in range(1, 20): # Имитируем процесс time.sleep(20000) # Что-то загружаем ap.showMessage("Загрузка данных...(0%)".format(i*10), QtCore.Qt.AlignmentFlag.AlignHCenter| QtCore.Qt.AlignmentFlag.AlignBottom, QtCore.Qt.GlobalColor.red) # Принудительно обрабатываем события QtWidgets.QApplication.instance().processEvents() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.setWindowTitle("Разворачивание и сворачивание окон") window.resize(300, 100) splash = QtWidgets.QSplashScreen(QtGui.QPixmap("screen2.jpg")) splash.showMessage("Загрузка данных... (0)%", QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignBottom, QtGui.QColor("red")) splash.show() QtWidgets.QApplication.instance().processEvents() window.show() splash.finish(window) sys.exit(app.exec()) Помогите пожалуйста разобраться .... Заранее благодарю |
57
: 09-01-2025 14:09
|
||
Автор WWX - Последний ответ от WWX | ||
В одном из примеров, прилагаемых к книге У. Они, замечен следующий код:
Код: (C++) NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp) Но в описании ф-ции KeAcquireSpinLock:{ PAGED_CODE(); ... KeAcquireSpinLock(&pdx->eventlock, &oldirql); ... } The code within a critical region guarded by an spin lock must neither be pageable nor make any references to pageable data. Вроде бы можно предположить, что часть расположенного после захвата спин-блокировки кода может отсутствовать в памяти. И т. к. IRQL после захвата будет слишком высок для страничного сбоя, то будет просто сбой? Вероятность этого конечно очень мала, но всё же... (Скорее всего я что-то упускаю из вида, и хотелось бы понять что именно...) |
58
: 01-01-2025 15:32
|
||
Автор Assol - Последний ответ от Люсь | ||
Интересный дискусс.
|
59
: 25-12-2024 14:08
|
||
Автор WWX - Последний ответ от WWX | ||
Согласен.
Хотя, на мой взгляд, под Linux драйвера легче пишутся (несколько лет, правда, не писал таких...) А вот под user space лично мне кодить больше прёт именно под Windows. |
60
: 24-12-2024 16:18
|
||
Автор WWX - Последний ответ от Ochkarik | ||
WWX, и я не линуксоид) каждый раз когда сталкиваюсь чисто пользовательски, на принтер прошивку поставить - меня в ужас приводит каждое действие, легко неделями разбираться надо каждым необходимым действием... один раз делал простейшие действия по инструкции, а она оказалась от другой версии ядра)
PS и да, иногда простейшее действия вызывают массу сложностей))) но зато документация все таки есть и подходит как правило начиная от 98-го до 10тки) |