• Как получить строку структуры из указателя на нее?

    15432
    @15432
    Системный программист ^_^
    Посмотрите хоть что есть UNICODE_STRING

    как-то так:
    wchar_t * str = ObjectAttributes->ObjectName->Buffer;
    Ответ написан
    1 комментарий
  • Почему сервер выдает 500 ошибку?

    JimmDiGreez
    @JimmDiGreez
    Full-stack Developer
    Ну-с, в ходе обсуждения выяснили, что после установки php свежей версии apache не был сконфигурирован на его использование.
    Ответ написан
    Комментировать
  • Что означает эта строка(модификатор в макросе)?

    @4elovek37
    Программист C++
    Макрос упрощает импорт из dll в программу. Там, где будете использовать "MYLIBAPI", будет разворачиваться директива импорта из dll.
    extern "C" обозначает использование простой генерации сигнатуры функции (в стиле языка С) при получении объектных файлов. В частности, это запрещает компилятору C++ производить "декорацию" (или "украшение") имени функции дополнительными символами при работе с DLL
    Пример:
    extern "C" __declspec(dllimport)double AddNumbers(double a, double b);
    в вашем случае можно писать
    MYLIBAPI double AddNumbers(double a, double b);
    Ответ написан
    Комментировать
  • Что означает эта строка(модификатор в макросе)?

    @Mercury13
    Программист на «си с крестами» и не только
    Тут есть два модификатора.

    1. extern "C" — говорит, что функцию НЕ надо «козявить» на манер Си++, кодируя в имени её параметры наподобие h(int) → _Z1hi. Используется для доступа из Си++ к функциям, которые скомпилированы другим компилятором (Паскалем, Си…), а также для всяких там функций, которым надо дать фиксированное имя — например, функций DLL.

    2. __declspec(dllimport). Это нужно для доступа к функциям DLL: линкер будет брать функции прямо из DLL, без создания *.lib или *.a (как минимум MinGW так работает). Языки, сильно привязанные к определённой ОС (например, Delphi) могут создавать свои ключевые слова для доступа, например, к DLL или COM.
    procedure DoSomething(x : integer); cdecl;  external 'something.dll';

    Застандартизированный Си вынуждает полагаться на ключевые слова, начинающиеся с двух подчерков.
    Ответ написан
    Комментировать
  • Зачем нужен указатель на void?

    @Mercury13
    Программист на «си с крестами» и не только
    void* используется как указатель на сырые байтовые данные, не имеющие конкретного типа.
    Обычно это используется…
    1. В чтении-записи в файлы и на устройства, когда мы можем писать туда абсолютно любые типы.
    2. В «многоликих» функциях, которые могут принимать данные разных типов (malloc/calloc, часть функций WinAPI и ODBC).
    3. Как дескриптор — указатель, который запрещается разыменовывать. В Си для этого также часто используют указатель на недоопределённый тип, в Паскале с другими правилами эквивалентности типов — на пустой record. Но только пока не появится очередная многоликая функция вроде CloseHandle.
    4. Для обеспечения т.н. замыкания — передачи callback’у контекста, откуда была вызвана функция, вызвавшая callback.
    BOOL WINAPI EnumWindows(
      _In_ WNDENUMPROC lpEnumFunc,
      _In_ LPARAM      lParam
    );
    
    BOOL CALLBACK EnumWindowsProc(
      _In_ HWND   hwnd,
      _In_ LPARAM lParam
    );

    Вот этот LPARAM, который обычно определяется как какой-то указатель, и есть замыкание. Функция EnumWindows обещает передать его в функцию lpEnumFunc без изменений.
    (В Си++ для этого также используют виртуальные интерфейсы, но такой метод, сами понимаете, языкозависим и не годится для межъязыкового API.)

    Что происходит на стороне функции? Одно из двух (считаем, функция написана на ЯВУ).
    1. Либо вызывается некая функция устройства, которая говорит: «записать 100 байт», и дальше уже работает железо.
    2. Либо мы преобразуем void* в нужный нам тип и работаем с ним.

    Типы указателям дают по трём причинам.
    1. Вы забыли про операцию «разыменовать указатель». Чтобы его разыменовать, он должен иметь тип!
    2. Чтобы не ошибаться и не переприсвоить несовместимые указатели.
    3. Для полиморфизма — в Си++, давая delete x, мы даже можем не хранить, сколько байтов в блоке, поскольку мы знаем длину типа. (Есть ещё и виртуальные классы, но это другой вопрос.)
    Ответ написан
    Комментировать
  • Загружается ли код DLL библиотеки в виртуальную память?

    pavelkarinin
    @pavelkarinin
    Full Stack Web Developer
    Если объяснить очень-очень по-простому и не вдаваться в тонкости, то дело обстоит так: DLL, которые содержат исполняемые функции, методы и прочее действительно должны быть загружены в адресное пространство, которое представляет собой некий буфер, он выделяется из объема оперативной памяти и этот буфер принадлежит только этому процессу, т.е. тому процессу, в котором выполняется приложение. Физическая память к этому диалогу между приложением и DLL не имеет никакого отношения... это если кратко и без фанатизма.
    Ответ написан
    4 комментария
  • Как windows выделяет память для процессов?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    как она взаимодействует с ОЗУ и инструкции по взаимодействию ко всему этому через WinAPI
    В таком контексте - никак.

    Все программы работают с виртуальной памятью - другой нет.
    А уже сама ОС решает как взаимодействовать с реальным хранилищем данных, будь то планка ОЗУ, или файл подкачки. И вы не можете никак на это влиять.

    Задача Windows как раз и стоит в том чтобы полностью изолировать вас от таких вещей как ОЗУ.
    Ответ написан
    Комментировать
  • Как windows выделяет память для процессов?

    @diadiafiodor
    какой-то человек с улицы
    Насколько я могу судить, с oc windows сложилась крайне маразматическая ситуация из-за политики кампании согласно которой они не могут разглашать данные об архитектуре системы, это секрет Полишинеля, но, поскольку все многозадачные ОС более или менее похожи, об архитектуре операционных систем вы можете осведомиться у конкурентов, например есть русский автор Сергей Дунаев, который прекрасно освещает тему памяти в юниксподобных системах тут после прочтения раздела посвященного свопингу для вас не составит большого труда понять что значит
    размер страничного файла и т.д.
    потому что там все разжевано.
    Ответ написан
    Комментировать
  • Как windows выделяет память для процессов?

    ApeCoder
    @ApeCoder
    Я бы посоветовал книжку "Windows Internals" Марка Руссиновича. Там описан процесс выделения памяти и вообще Memory Manager.

    Так же стоит ознакомиться с тем как это делает процессор. Например вот описание

    Почитать справку по функциям VirtuallAllocEx, VirtualLock и вокруг
    Ответ написан
    Комментировать
  • Как windows выделяет память для процессов?

    @res2001
    Developer, ex-admin
    Виртуальная память реализуется аппаратно-программным способом, т.е. без поддержки процессора не обойтись, поэтому ОС тут вовсе не "законодатели мод", а всего лишь используют подход предложенный разработчиками железа. Конечно, писатели осей могут то же поучаствовать в процессе проектирования железа и часто так и происходит, даже можно предположить, что сама виртуальная память появилась именно из-за хотелок разработчиков ОС. Этот подход принципиально одинаков что в винде что в линуксе для интеловских процов, т.к. диктуется спецификацией процессора, естественно разные реализации, но делают они одно и то же.
    Поэтому смело можете читать по этому поводу литературу о том как работает линукс с виртуальной памятью (если найдете), в общих чертах винда работает так же.
    Так же можно читать интеловскую документацию.
    Но, на самом деле, если вы не собираетесь разрабатывать ядра ОС, достаточно понимать в общих чертах как это работает.

    Вообще Рихтер хорошо пишет, попробуйте перечитать :-)

    Виртуальная память не "взаимодействует с ОЗУ" - ОЗУ неотъемлемая часть виртуальной памяти.
    Ответ написан
    2 комментария
  • Что за WINAPI, CALLBACK перед названиями функций?

    @Mercury13
    Программист на «си с крестами» и не только
    На x86 оба они — макроопределения для нестандартного соглашения вызова __stdcall.
    На ARM они ничего не делают.

    Соглашение вызова — это…
    • как на уровне регистров мы вызываем функцию;
    • кто подчищает стек за вызывающим;
    • кто отвечает за восстановление регистров, если они менялись (или есть риск, что они менялись).

    stdcall — вызов через стек, справа налево, за очистку стека отвечает функция, результат в eax (rax), функция отвечает за восстановление сегментных регистров, esp и ebp, программа за остальные.

    На ARM используется соглашение cdecl. То же самое, но за очистку стека отвечает программа (что там на ARM с регистрами, я не в курсе).
    Ответ написан
    Комментировать
  • Актуальна ли сейчас литература Рихтера (Win32 приложения)?

    Andrey2008
    @Andrey2008
    DevRel в PVS-Studio
    Смело читайте. Отличная книга.
    Ответ написан
    Комментировать
  • Стоит ли полностью изучать материал, если он не нужен?

    @alexalexes
    Если вы взялись писать только одну прогу, затрагивающую данный материал, то все что-то вам не по теме будет вредно.
    Если на регулярной основе будете в WinAPI зависать, то лучше не глотать целиком материал, а делать заметки, что где и как найти, если приспичит, написать еще какой-нибудь софт.
    В голову все не положишь. Жизнь коротка. И тд.
    Ответ написан
    Комментировать
  • Почему буфер приема WinSock заполняется мусором?

    @res2001
    Developer, ex-admin
    А если я смотрю strlen(recvbuf) то получаю 16. Откуда берется такой хвост?

    В recvbuf вы получаете не с-строку, а массив байт, применять строковые функции к массиву байт бессмысленно.
    Отличие с-строки от массива в том, что строка оканчивается завершающим нулем, а в массиве байт вы должны знать длину массива. В с-строке символ 0 не может быть в теле самой строки, только в качестве терминального символа, в массиве байт 0 - такой же равноправный элемент данных, как и все остальные, может быть в любом месте массива или не быть вовсе.
    Вам еще повезло, что выдает 16 байт, вместо 4, вполне могло бы сложиться так, что нулевого байта не было бы на достаточно продолжительном участке памяти, тогда был бы просто вылет из программы или какие-либо трудно диагностируемые глюки.
    Ответ написан
    5 комментариев
  • Зачем в абстрактном базовом классе создавать конструктор?

    @Mercury13
    Программист на «си с крестами» и не только
    Абстрактные классы делят на интерфейсы и частично реализованные. Грань между ними такова:
    • Интерфейс не имеет данных.
    • У интерфейса все неабстрактные виртуальные методы представляют собой или эталонное поведение, или самую частую реализацию. В обоих случаях, если что, их надо не расширять, а переписывать с нуля.

    Так вот, для интерфейсов таких конструкторов, разумеется, не нужно.

    Например, между абстрактным потоком и файлом Win32 может быть такая иерархия: Stream → HandleStream → File. Stream — интерфейс, даже если там есть что-то типа
    // virtual
    unsigned long long Stream::remainder() const { return size() - pos(); }


    HandleStream содержит уже данные (дескриптор Win32), и это уже частично реализованный класс, который крутится вокруг этого дескриптора: в деструкторе вызов CloseHandle, конструктор может принимать дескриптор, полученный каким-то «левым» образом.
    HandleStream::HandleStream(HANDLE aHandle) : fHandle(aHandle) {}
    HandleStream::~HandleStream() { close(); }
    
    void HandleStream::close()
    {
      if (Handle != INVALID_HANDLE)  { // не помню, как там эта константа в Win32
        CloseHandle(fHandle);
        fHandle = INVALID_HANDLE;
      }
    }

    Вот в таких полуреализованных классах, разумеется, конструктор может инициализировать те данные, которые там есть.
    Ответ написан
  • Почему компилятор выдает ошибку?

    Nipheris
    @Nipheris Куратор тега C++
    g++ *.cpp -o test.exe
    Ответ написан
    Комментировать
  • Почему gitignore пропускает файлы из его списка?

    v_decadence
    @v_decadence
    Потому что они уже были закоммичены до добавления их в .gitignore?
    Ответ написан
    Комментировать
  • Как распределять свои проекты?

    @res2001
    Developer, ex-admin
    Освойте утилиту make и makefile.
    Ответ написан
    1 комментарий
  • Как распределять свои проекты?

    Adamos
    @Adamos
    Без VS (слишком громоздкая для моих начинаний)

    QtCreator
    Code::Blocks
    CodeLite
    и множество других IDE без лишней монструозности, избавляющих от тупой ручной работы.
    Ответ написан
    6 комментариев
  • Как распределять свои проекты?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Используйте cmake.
    Ответ написан
    Комментировать