Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Dword что это

Dword что это

Данные каким-либо образом необходимо представлять в памяти компьютера. Существует множество различных типов данных, простых и довольно сложных, имеющих большое число компонентов и свойств. Однако, для компьютера необходимо использовать некий унифицированный способ представления данных, некоторые элементарные составляющие, с помощью которых можно представить данные абсолютно любых типов. Этими составляющими являются числа, а вернее, цифры, из которых они состоят. С помощью цифр можно закодировать практически любую дискретную информацию. Поэтому такая информация часто называется цифровой (в отличие от аналоговой, непрерывной).

Первым делом необходимо выбрать систему счисления, наиболее подходящую для применения в конкретных устройствах. Для электронных устройств самой простой реализацией является двоичная система: есть ток — нет тока, или малый уровень тока — большой уровень тока. Хотя наиболее эффективной являлась бы троичная система. Наверное, выбор двоичной системы связан еще и с использование перфокарт, в которых она проявляется в виде наличия или отсутствия отверстия. Отсюда в качестве цифр для представления информации используются 0 и 1.

Таким образом данные в компьютере представляются в виде потока нулей и единиц. Один разряд этого потока называется битом. Однако в таком виде неудобно оперировать с данными вручную. Стандартом стало разделение всего потока на равные последовательные группы из 8 битов — байты или октеты. Далее несколько байтов могут составлять слово. Здесь следует разделять машинное слово и слово как тип данных. В первом случае его разрядность обычно равна разрядности процессора, т.к. машинное слово является наиболее эффективным элементом для его работы. В случае, когда слово трактуется как тип данных (word), его разрядность всегда равна 16 битам (два последовательных байта). Также как типы данных существую двойные слова (double word, dword, 32 бита), четверные слова (quad word, qword, 64 бита) и т.п.

Теперь мы вплотную подошли к представлению целых чисел в памяти. Т.к. у нас есть байты и различные слова, то можно создать целочисленные типы данных, которые будут соответствовать этим элементарным элементам: byte (8 бит), word (16 бит), dword (32 бита), qword (64 бита) и т.д. При этом любое число этих типов имеет обычное двоичное представление, дополненное нулями до соответствующей размерности. Можно заметить, что число меньшей размерности можно легко представить в виде числа большей размерности, дополнив его нулями, однако в обратном случае это не верно. Поэтому для представления числа большей размерности необходимо использовать несколько чисел меньшей размерности. Например:

  • qword (64 бита) можно представить в виде 2 dword (32 бита) или 4 word (16 бит) или 8 byte (8 бит);
  • dword (32 бита) можно представить в виде 2 word (16 бит) или 4 byte (8 бит);
  • word (16 бит) можно представить в виде 2 byte (8 бит);

Если A — число, B1..Bk — части числа, N — разрядность числа, M — разрядность части, N = k*M, то:

  • A = F1E2D3C4B5A69788 (qword)
  • A = 2 32 * F1E2D3C4 (dword) + 2 0 * B5A69788 (dword)
  • A = 2 48 * F1E2 (word) + 2 32 * D3C4 (word) + 2 16 * B5A6 (word) + 2 0 * 9788 (word)
  • A = 2 56 * F1 (byte) + 2 48 * E2 (byte) + . + 2 8 * 97 (byte) + 2 0 * 88 (byte)

Существуют понятия младшая часть (low) и старшая часть (hi) числа. Старшая часть входит в число с коэффициентом 2 N-M , а младшая с коэффициентом 2 0 . Например:

Байты числа можно хранить в памяти в различном порядке. В настоящее время используются два способа расположения: в прямом порядке байт и в обратном порядке байт. В первом случае старший байт записывается в начале, затем последовательно записываются остальные байты, вплоть до младшего. Такой способ используется в процессорах Motorola и SPARC. Во втором случае, наоборот, сначала записывает младший байт, а затем последовательно остальные байты, вплоть до старшего. Такой способ используется в процессорах архитектуры x86 и x64. Далее приведен пример:

Используя подобные целочисленные типы можно представить большое количество неотрицательных чисел: от 0 до 2 N -1, где N — разрядность типа. Однако, целочисленный тип подразумевает представление также и отрицательных чисел. Можно ввести отдельные типы для отрицательных чисел от -2 N до -1, но тогда такие типы потеряют универсальность хранить и неотрицательные, и отрицательные числа. Поэтому для определения знака числа можно выделить один бит из двоичного представления. По соглашению, это старший бит. Остальная часть числа называется мантиссой.

Если старший бит равен нулю, то мантисса есть обычное представление числа от 0 до 2 N-1 -1. Если же старший бит равен 1, то число является отрицательным и мантисса представляет собой так называемый дополнительный код числа. Поясним на примере:

Как видно из рисунка, дополнительный код равен разнице между числом 2 N-1 и модулем исходного отрицательного числа (127 (1111111) = 128 (10000000) — |-1| (0000001)). Из этого вытекает, что сумма основного и дополнительного кода одного и того же числа равна 2 N-1 .

Из вышеописанного получается, что можно использовать только целочисленные типы со знаком для описания чисел. Однако существует множество сущностей, которые не требуют отрицательных значений, а значит, место под знак можно включить в представление неотрицательного числа, удвоив количество различных неотрицательных значений. Как результат, в современных компьютерах используются как типы со знаком или знаковые типы, так и типы без знака или беззнаковые типы.

В итоге можно составить таблицу наиболее используемых целочисленных типов данных:

Почему в C++ мы используем DWORD, а не unsigned int?

Я не боюсь признаться, что я немного новичок в C++, так что это может показаться глупым вопросом, но.

Я вижу, что DWORD используется повсюду в примерах кода. Когда я смотрю, что на самом деле означает DWORD, это, по-видимому, просто неподписанный int (от 0 до 4,294,967,295). Итак, мой вопрос заключается в следующем: почему у нас есть DWORD? Что же это дает нам, чего не дает интегральный тип ‘unsigned int’? Это как-то связано с мобильностью и различиями в машинах?

4 Ответов

DWORD не является типом C++, он определен в .

Причина в том, что DWORD имеет определенный диапазон и формат, на который полагаются функции Windows, поэтому, если вам требуется этот конкретный диапазон, используйте этот тип. (Или как они говорят: «когда ты в Риме, делай так, как делают римляне.») Для вас это соответствует unsigned int , но это может быть не всегда так. Чтобы быть в безопасности, используйте DWORD , когда ожидается DWORD , независимо от того, что это может быть на самом деле.

Например, если бы они когда-либо изменили диапазон или формат unsigned int , они могли бы использовать другой тип, чтобы подчинить DWORD тем же требованиям, и весь код, использующий DWORD , был бы none-the-wiser. (Аналогично, они могут решить, что DWORD должен быть unsigned long long , изменить его, и весь код, использующий DWORD , будет none-the-wiser.)

Также обратите внимание, что unsigned int не обязательно имеет диапазон от 0 до 4,294,967,295. Видеть здесь .

Когда MS-DOS и Windows 3.1 работали в 16-разрядном режиме, слово Intel 8086 составляло 16 бит, Microsoft WORD-16 бит, Microsoft DWORD-32 бита, а типичный неподписанный int компилятора составлял 16 бит.

Когда Windows NT работал в 32-разрядном режиме, слово Intel 80386 составляло 32 бита, Microsoft WORD-16 бит, Microsoft DWORD-32 бита, а типичный неподписанный int компилятора-32 бита. Имена WORD и DWORD больше не были самоописательными, но они сохранили функциональность программ Microsoft.

Читать еще:  Как изменить данные в ячейке excel

Когда Windows работает в 64-битном режиме, процессор Intel составляет 64 бит, Майкрософт WORD-16 бит, Майкрософт DWORD-это 32 бита, и типичного компилятора неподписанных int-это 32 бита. Имена WORD и DWORD больше не являются самоописательными, AND unsigned int больше не соответствует принципу наименьших сюрпризов, но они сохраняют функциональность множества программ.

Я не думаю, что WORD или DWORD когда-нибудь изменятся.

SDK разработчики предпочитают определять свои собственные типы с помощью typedef. Это позволяет изменять базовые типы только в одном месте, без изменения всего клиентского кода. Важно следовать этой конвенции. DWORD вряд ли будет изменен, но типы, такие как DWORD_PTR, отличаются на разных платформах, таких как Win32 и x64. Итак, если какая-то функция имеет параметр DWORD, используйте DWORD, а не unsigned int, и ваш код будет скомпилирован во всех будущих версиях заголовков windows.

Для себя я бы предположил, что unsigned int является специфичной платформой. Целое число может быть 8 бит, 16 бит, 32 бита или даже 64 бита.

DWORD с другой стороны, указывает свой собственный размер, который является двойным словом. Word — это 16 бит, поэтому DWORD будет называться 32-битным по всей платформе

Похожие вопросы:

предупреждение: сужающее преобразование ‘(stride * 4u) ‘из ‘unsigned int’ в’ WORD ‘ внутри < >неправильно сформировано в C++11 [-Wnarrowing] Я не могу понять, почему я.

Мой вопрос прост (я надеюсь)о синтаксисе c относительно объявления указателя. Я полностью осведомлен о том, как объявить указатель, как его использовать и каковы эффекты, например, следующим.

Я видел это из C Primer Plus, 6-го издания , вопросы обзора в главе 3. Вопрос: Ответ в приложении а: Обратите внимание d.0XAA, мой ответ int константа, шестнадцатеричный формат, но ответ unsigned.

Возможный Дубликат : сравнение unsigned int и signed char int j = 10; unsigned int i = 10; if( j > -1 ) printf(1n); else printf(2n); if( i > -1 ) printf(3n); else printf(4n); Выход есть .

Я получаю эту ошибку и не могу ее исправить. Любая помощь приветствуется. Спасибо. ошибка C2440: ‘=’: не удается преобразовать из ‘DWORD *’ в ‘unsigned int’ IntelliSense: значение типа DWORD *.

Error: Cannot convert DWORD* to ‘long unsigned int*’ for argument 1 to int tea_encrypt(long unsigned int*,) Вот этот код : bool CLZObject::Encrypt(DWORD * pdwKey) < if.

Поскольку long шире, чем int, дающий Нижний порядок unsigned long должен возвращать что-то большее, чем просто Нижний порядок unsigned int. Почему функция все еще знает, что такое нижний порядок.

Эта программа <$APPTYPE CONSOLE> <$TYPEDADDRESS ON>uses Winapi.Windows; procedure Foo(P: PDWORD); begin end; procedure Bar; var dw: DWORD; begin Foo(@dw); end; begin end. компилируется в XE3, но не.

Когда мы рассматриваем некоторые фундаментальные типы данных, такие как char и int, мы знаем, что char-это просто беззнаковый байт (в зависимости от языка), int-это просто знаковое слово dword.

Я считаю, что когда вы добавляете два значения unsigned int вместе, тип данных возвращаемого значения будет unsigned int . Но добавление двух значений unsigned int может возвращать значение, которое.

Дневники чайника. Чтива 0, виток0

Пятый день.
О словах и двойных словах
(форматы данных)

Не сказать чтоб эта тема была самая сложная, но то, что она самая запутанная — это 100%.

То, что я здесь напишу, довольно туго для восприятия, однако со временем всё уляжется. Не расстраивайтесь, если вдруг в этой главе покажется, что Ассемблер очень сложный, вспомните о таком фокусе.

Не каждый водитель знает, что для того, чтоб машина ехала вперёд, колесо в точке соприкосновения с дорогой должно двигаться назад. Хотя такая информация была сообщена каждому водителю и каждому человеку. Ну, едет машина и едет, какая разница, куда крутятся колёса. Это нужно знать только при смене колёс, чтоб не перепутать направленность резины, или во время ремонта.

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

Матрос, ты должен знать своего друга (со стороны потенциального противника) лучше, чем себя.

Бинарники организуются в отряды по восемь, эти отряды называются байтами. Запомнил?

Байт — это минимальная расчетная единица бинарной армии. Запомнил?

2 байта организуются в слово (word).

4 байта организуются в двойное слово (dword, а пОлно — double word).

Dword — это самый распространённый набор битов в Win32-программах. Так как:

В предыдущей программе мы столкнулись вот с такой строкой:

«d,» здесь как раз и заменяет dword.

Я объяснил, что когда операнд находится в квадратных скобках, при команде mov это означает, что нужно производить действие по адресу в памяти, указанному операндом. То есть в BX раньше должен быть положен адрес. В ходе выполнения этой строки BX не изменяется, изменится только память по адресу, указанному BX. Размер изменяемой памяти dword (4 байта, двойное слово).

Остаётся маленький такой вопросик: почему в дизассемблере байты операндов команд процессора мы видим зеркально значениям операндов в командах Асма?

Запомни, матрос, Бинарники очень хитрые. Для того, чтоб их враг путал байты по старшинству, в каждой целой боевой единице, будь то word (2 байта), dword (4 байта), qword (8 байт), байты строятся от младшего к старшему, черт их дери!

Адрес, который был указан в BX, равен 0133h.

А действие выглядит так:

В отладчике вы видели это вот так:

Мы пишем и читаем текст по-европейски — слева направо. Но для чисел большинство людей использует арабскую запись — справа налево (хотя читаем числа тупо от старшей цифры =).

К великому огорчению, программистами был принят смешанный формат отображения данных. Каждый байт отображается по арабской системе, а целая группа байтов — по европейской. Выходит, что на экране мы видим разную запись. Если программа-дизассемблер или отладчик воспринимают группы байтов как ЦЕЛОЕ число, то оно отображается арабской записью, как в колонке команд Ассемблера: 04 03 02 01, а если речь идёт просто о нескольких байтах, то мы видим европейскую запись, только за букву принят целый байт, что и показано выше: 01 02 03 04. Всё это лишь вопрос отображения на экране или в документах. Например, если использовать запись цифровых значений от нижнего правого угла экрана до верхнего левого (справа налево, снизу вверх), то вообще ничего переворачивать не нужно! То есть если бы была принята запись «справа налево всё» или «слева направо всё», то подобных проблем не было бы вообще.

Допустим, мы набрали вот такую строку:

Здесь мы указали, что размер данных word (2 байта) и эти данные будут помещены в память по адресу 800h.

Объясню сейчас коротко.

Раз мы имеем заданный размер word (или как в Hiew’е «w,»), мы имеем некое ЦЕЛОЕ.

Младший байт (у нас AA) будет находиться по наименьшему адресу, а старший байт (BB) — по более старшему адресу.

Читать еще:  Selecting a word

Вот как эта строка будет выглядеть в Hiew’e:

В колонке операндов — так, как мы вводили (число BBAAh). А вот в колонке байтов мы видим зеркальное расположение байтов операндов — 00 08, AA BB.

И точно так же устроены dword. Допустим:

Вопрос, который наверняка возник у всех (и я предполагаю, что у многих в нецензурной форме): «На. в смысле зачем?»

Это нужно для того, чтобы процессор забирал байты из памяти, начиная с младшего (так быстрее вычислять). Ведь получается, что адрес числовой переменной любого размера, хоть word, хоть dword, будет указывать на младший байт в числе, далее пойдёт следующий байт в числе, и самый старший байт в числе всегда окажется в конце. Вычислять процессору так значительно быстрее.

Я думаю, что многие читатели совсем запутались, тут есть только одно утешение: перекладывать байты в голове совсем не нужно. Чтобы получить целое число из байтов или, наоборот, из числа сложить байты, достаточно переключить режим отображения в программе. Мало того, при простом программировании можно забыть об этих премудростях и вспоминать лишь изредка.

Всё, из теории остались только циклы и стек, о них мы будем говорить завтра.

Матрос! Я что-то не заметил, чтоб ты разрабатывал кнопку F10!

Если ты хочешь стать капитаном собственного корабля, пусть даже и без гипердвигателя, ты должен отлаживать и отлаживать.

Послезавтра я увижу своё отражение в F10-key у тебя на клавиатуре или я высажу тебя на ближайшей заброшенной планете.

А чтоб было веселей давить на кнопку F10, загони в отладчик следующую программу (prax03.com).

Набивайте всё сами, только так можно научиться.

В Hiew’e она должна выглядеть так:

Но это не всё, теперь переключитесь на Hex-режим (F4) и добейте программу следующими байтами после всего кода. Это будут «данные».

На самом деле все эти пробелы (20h) программе НЕ нужны. Но когда вы будете смотреть программу в отладчике, они вам помогут.

Если у вас будет сдвиг хоть на байт, программа будет ошибочной. Поэтому проверьте, чтобы строка «-=Асм=-$» начиналась с 50h и, что ещё более важно, два нулевых байта (00 00) должны быть в файле по адресам 75 и 76h. Обязательно посмотрите в отладчике, что будет происходить с этими байтами (там они будут 175h и 176h). Всё остальное здесь мишура и для выполнения программы совершенно не имеет значения.

При отладке могут появляться сообщения насчёт экрана. ну и фиг с ними. Если в CV опция Screen Swap ещё не выключена, то это обязательно нужно сделать.

Результат действия этой программы — вывод строк по диагонали от верхнего левого угла до нижнего правого угла.

Здесь очень много нового, и я надеюсь, вам будет интересно узнать, как работают новые команды CMP и JNE.

Попробуйте сами разобраться, что происходит в программе на практике. Как я уже писал, прерываний (команда int) при написании программ Win32 мы использовать не будем. Поэтому можете не заострять на них внимание. Достаточно знать, что это полезные подпрограммы, часть которых заложена ещё в BIOS (basic input/output system — базовая система ввода/вывода).

Я вынужден их использовать только для того, чтобы программа была полноценная и вы могли наглядно изучать главные команды Ассемблера.

В данном примере будут задействованы int 10h для очистки экрана (AL=3) и для расположения курсора текста (AH=2). Ну и int 21h для вывода текста на экран. Всё, других прерываний в уроках больше не будет. О них за долгие годы написано достаточно.

Вот как программа должна трактоваться (сразу скажу — про метки я всё объясню позже).

Перед разбором этой программы я хочу рассказать о ключевом понятии в программировании — циклы.

Как создавать разделы и параметры в реестре Windows

Реестр Windows является одной из самых загадочных частей операционной системы Windows, которая позволяет настраивать и модифицировать почти все аспекты Windows. Некоторые работают с реестром постоянно, но большинство людей имеют о нем лишь слабое представление и не совсем уверены, как создавать пользовательские разделы и параметры. Итак, давайте попробуем разобраться, что же такое реестр Windows.

Что такое реестр Windows

Реестр Windows – это не что иное, как совокупность различных конфигураций и настроек, связанных с операционной системой, программами и пользователями. Его можно рассматривать как базу данных, хранящую практически всю важную информацию. Эта информация включает в себя все то, что связанно с системой аппаратного обеспечения, настройками приложений, установленными программами, профилями пользователей и т.д. Windows обращается к реестру постоянно, поскольку, как уже было сказано, в нем хранится вся важная информация, и операционной системе гораздо быстрее и проще управлять всем из одного места, чем возиться с отдельными файлами конфигурации, расположенными в разных местах.

Компоненты реестра Windows

Реестр Windows состоит из трех основных компонентов – ключи корневого уровня, разделы и параметры.

Ключи корневого уровня содержат в себе разделы, которые имеют свой собственный набор параметров.
Существует пять различных ключей корневого уровня, и все они имеют свои собственные специфические цели в реестре. Вот их суть:

  • HKEY_CLASSES_ROOT (HKCR): этот ключ используется для связывания и внедрения объектов (Object Linking and Embedding, OLE) и ассоциации типов файлов. Это ключ, где Windows связывает файлы с их соответствующими программами, чтобы пользователь мог открывать и взаимодействовать с ними.
  • HKEY_CURRENT_USER (HKCU): этот раздел реестра Windows хранит все данные, настройки на уровне пользователя и конфигурации, связанные с вошедшим в систему пользователем. Не только Windows, но и другие программы хранят здесь данные, относящиеся к текущему пользователю.
  • HKEY_LOCAL_MACHINE (HKLM): независимо от статуса пользователя, этот ключ содержит все системные разделы, в том числе любые аппаратные настройки, параметры программного обеспечения и т.д. Поскольку HKLM содержит большую часть всей системной информации, он является одним из самых открытых корневых ключей реестра Windows.
  • HKEY_USERS (HKU): как следует из названия, этот корневой ключ содержит параметры всех пользователей, включая вошедших и вышедших из системы, так что не путайте этот ключ с HKCU.
  • HKEY_CURRENT_CONFIG (HKCC): проще говоря, это псевдо корневой ключ, поскольку он является прямой ссылкой на текущие параметры профиля оборудования в корневом ключе HKLM.
Параметры разделов

Каждый из этих корневых ключей имеет свои собственные разделы, а каждый раздел имеет свои собственные параметры. В каждом разделе можно создать 6 различных типов параметров, а значения этих параметров полностью зависят от целевой программы и/или требований к конфигурации.

А вообще есть четыре основных типа данных, используемых в редакторе реестра Windows:

  • Строковый параметр: состоит из простого читаемого текста и является одним из наиболее часто используемых параметров в реестре Windows.
  • Двоичный параметр: как следует из названия, этот параметр содержит только двоичные данные (0, 1). Часто используется для включения или выключения определенной функции.
  • Параметр DWORD (32 бита): похож на двоичный параметр, но способен хранить любое целое число в диапазоне от 32 бит. Предназначен для работы с 32-битными системами, но также используется в 64-битных системах в целях обеспечения обратной совместимости.
  • Параметр QWORD (64 бита): этот параметр почти как DWORD, но способен нести любое целое число в диапазоне от 64 бит. Можно сказать, что QWORD предназначен для работы с 64-битными системами.
Читать еще:  Как добавить примечание в word 2020
Как открыть редактор реестра

Этот способ будет работать независимо от установленной версии Windows:

Нажмите клавишу + клавишу R, чтобы открыть окно «Выполнить». Введите regedit или regedit.exe и нажмите Enter или OK. Если появится окно контроля учетных записей (UAC), нажмите «Да».

Основной исполняемый файл редактора реестра находится в каталоге C:Windows. Так что можно открыть эту папку и запустить файл regedit.exe напрямую, или можно просто создать ярлык regedit.exe в удобном для вас месте.

Редактор реестра: для 64-разрядных и 32-разрядных Windows

Реестр в 64-битных версиях Windows состоит из 32-битных и 64-битных разделов. Многие из 32-битных разделов имеют те же самые названия, что и их 64-битные аналоги, и наоборот.

64-разрядная версия (используется по умолчанию) (regedit.exe) отображает как 64-битные, так и 32-битные разделы. В 64-разрядной версии редактора реестра 32-битные ключи отображаются в следующем разделе реестра:

Просматривать и редактировать 64-битные и 32-битные разделы и параметры можно с помощью 64-разрядной версии редактора реестра. Для просмотра или редактирования 64-битных ключей необходимо использовать 64-разрядную версию редактора реестра (regedit.exe). Редактировать и просматривать 32-битные ключи и значения можно также с помощью 32-разрядной версии редактора реестра (%systemroot%Syswow64). Чтобы открыть 32-разрядную версию редактора реестра, выполните следующие действия:

  • Откройте диалог «Выполнить».
  • Введите %systemroot%syswow64regedit и нажмите OK.

Создавать разделы и параметры очень просто. Но прежде чем что-либо делать, пожалуйста, создайте резервную копию реестра Windows, так как любые неверные настройки или удаление важных элементов может стать причиной критических ошибок.
Чтобы создать резервную копию реестра, в окне редактора нажмите «Файл -> Экспорт», введите имя файла и сохраните его в надежном месте.

Чтобы создать новый раздел, щелкните правой кнопкой мыши на ключе корневого уровня и выберите «Создать -> Раздел». Новый раздел будет выглядеть как папка, и по умолчанию будет называться что-то вроде «Новый раздел #1». Разумеется, раздел можно всегда переименовать. Такая же процедура применяется всякий раз, когда нужно создать новый подраздел.

Чтобы создать новый параметр, щелкните правой кнопкой мыши в пустой области правой панели редактора реестра и выберите нужный параметр. Созданному параметру нужно присвоить название; название полностью зависит от конкретных требований.

Чтобы присвоить параметру значение, дважды щелкните на нем и введите значение. Опять же, значение зависит от программы или конкретных настроек.

Права доступа к разделам реестра

По аналогии с правами и разрешениями на определенные объекты в файловой системе NTFS, такая же защита предусмотрена и для разделов реестра.

Еще со времен Windows Vista большое количество ОС-специфических ключей реестра, хранящих настройки Windows, находятся под защитой Windows Resource Protection, поэтому нельзя просто взять и удалить или изменить их. Вы не сможете сделать этого, не став их владельцем и не установив разрешения (права доступа) на них. К счастью, операционная система позволяет и это, но ручной способ чересчур муторный, поэтому лучше использовать простую утилиту RegOwnershipEx, которая автоматизирует весь этот процесс.

На этом все! Надеюсь, написанное выше помогло вам лучше понять реестр Windows и его основные компоненты. Обменивайтесь мнениями и опытом в комментариях ниже!

Что возвращает приведение типа DWORD к LPVOID?

Я иногда путаюсь при приведении типов в C ++, что именно они возвращают?

Более общее объяснение будет оценено. Спасибо

Решение

Он не возвращает ничего действительного или полезного.

Код, который вы показали,

глючит и сломан

Исторически LPVOID был дальний указатель на void (в отличие от ближнего указателя на void, PVOID ). Различение указателя дальнего / ближнего больше не имеет значения, так как мы больше не программируем на сегментированную архитектуру, так что теперь все это LPVOID значит это void* , Это эквивалентно PVOID (но вы редко видите последнее в коде сегодня, потому что все вызовы API были дальними и поэтому были созданы с LPVOID ).

DWORD Исторически тип был беззнаковым «двойным словом», что на x86 означало, что оно было 32-битным. Спецификация API все еще гарантирует, что DWORD является 32-разрядным типом без знака на все поддерживаемые архитектуры.

Что приводит нас к проблеме. DWORD тип фиксированного размера, представленный 32 битами LPVOID это указатель, и указатели могут быть разных размеров на разных архитектурах. И это не просто теоретическая проблема переносимости. Это очень практичный. На 64-битной архитектуре (x86-64 является не только поддерживаемой платформой для Windows, но и особенно популярной в настоящее время), DWORD будет 32 бита, но указатель будет 64 бита. Поэтому, если вы приведете 64-битный указатель к 32-битному целому числу, вы неизбежно потеряете некоторые данные. Вот что делает код неработающим. Он эффектно провалится на 64-битной цели.

Если вы хотите привести указатель к целочисленному типу, то вам нужно использовать либо DWORD_PTR (DWORD размером с указатель), INT_PTR (подписанное интегральное представление указателя), или UINT_PTR (целочисленное представление без знака указателя). Использование любого другого типа для хранения указателя делает ваш код ошибочным и сломанным.

Говоря в более общем смысле, лучше избегать таких типов приведения, которые приводят один тип к другому. Если бы вы написали это как приведение в стиле C ++, как я делал выше, вам нужно было бы написать reinterpret_cast (lpFunction) , что делает совершенно очевидным, что вы делаете что-то непереносимое и потенциально небезопасное. Правда, есть случаи, когда это совершенно нормально, и особенно в тех случаях, когда это требуется при программировании на Windows API. Это сводит с ума пуристов, но спецификация API гарантирует, что он будет работать. Ваш код становится непереносимым, но это вряд ли актуально, когда вы пишете программу, использующую специфичные для Windows API. Тем не менее, предпочитайте писать приведения в стиле C ++, чтобы было ясно, что вы делаете. потенциал проблема. Таким образом, любой, кто смотрит на код, может проверить его, чтобы убедиться, что приведение допустимо по правилам API, потому что компилятор больше не может этого делать. Актер говорит ему заткнуться и отключить обычные предупреждения.

Другие решения

LPVOID определяется как (Стиль Microsoft Windows) «длинный указатель void , то есть «указатель на то, что мне все равно».

Ты сейчас принуждающее что можно рассматривать как DWORD … который вам лучше знать (!) занимает то же количество байтов и сохраняет значение этого указателя в dw , Эта переменная теперь содержит то, что раньше считалось «адресом памяти», но это уже не адрес: это целое число из двух слов.

Это, кстати, очень опасная вещь в том смысле, что она делает много «предположений». Он также превращает тип указателя в не указатель (арифметика …). Это может легко привести ко всем видам трудно диагностируемых ошибки, и это стирает большую часть потенциальной способности компилятора обнаруживать такие ошибки для вас.

Ссылка на основную публикацию
Adblock
detector