Ответы пользователя по тегу C++
  • CCheckListBox - из-за чего кракозябры вместо текста?

    @Sumor
    Складывается ощущение, что у вас выставлена кодировка utf-32 (четырёхбайтная), а L"Channel 1" означает utf-16 (двухбайтная).
    Ответ написан
    Комментировать
  • Почему не видно определение класса?

    @Sumor
    Посмотрите используете ли вы предварительно скомпилированные заголовки (Precompiled headers).
    Если да, то есть ли в каждом .cpp первой строчкой запись
    #include "stdafx.h"

    Хорошая статья на Хабре
    Ответ написан
    Комментировать
  • Как реализовать передачу строк в C++ dll, изменить ее и вернуть в .Net C# проект?

    @Sumor
    Для описания и вызова функций из обычных dll на c/c++ используется класс Marshal.
    Можно выделить память, преобразовать строку, структуру в неуправляемую память и обратно.
    В примере вызывается функция GetComputerName, которая заполняет выделенную в программе память, а затем результат преобразуется в string и выводится на консоль.
    class Program
    {
        static void Main(string[] args)
        {
            // Выделение памяти из неуправляемой области
            // Получаем обычный указатель для использования в c/c++ функциях
            var pComputerName = Marshal.AllocHGlobal(256);
            // Вызываем описанную внешнюю функцию
            // Она будет работать непосредственно с памятью по указателю
            int size = 256;
            GetComputerName(pComputerName, ref size);
            // Переводим результат в управляемый вид
            var str = Marshal.PtrToStringUni(pComputerName);
            Console.WriteLine(str);
            // Обязательно освобождаем выделенную память
            Marshal.FreeHGlobal(pComputerName);
            Console.ReadLine();
        }
    
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        public static extern void GetComputerName(IntPtr pComputerName, ref int size); 
    }
    Ответ написан
  • Что происходит в этом коде?

    @Sumor
    Как следует из названия функции, она переворачивает биты числа.
    100111011 = 315 переворачивает в 110111001 = 441
    В цикле for заполняется текущий бит результата - сначала сдвигается на бит, и этот бит заполняется текущим справа битом исходного числа.
    Получается, что в цикле for биты перетекают из числа n в число r. С каждым циклом n сдвигается на бит и этот бит устанавливается в добавленный бит r.
    Ответ написан
    Комментировать
  • Почему не работают регулярки?

    @Sumor
    Символы { и } являются служебными и их нужно маскировать.
    std::regex pattern("[{](?:(\\w+):)*(\\w+)[}]");
    Ответ написан
    1 комментарий
  • Написал прогу, но немного сомневаюсь насчет правильности постановки условий

    @Sumor
    Условие as + asa == 2 лишнее, так как оно следует из условия as == 1 && asa == 1.
    Для подсчёта модуля можно использовать функцию abs. Либо вместо if при выборе знака использовать условный оператор ?:
    Для первого else лучше сразу использовать скобки {}- чтоб не запутаться.
    Ответ написан
  • Winapi, чужое приложение - проблемы с меню и окна отрисовываются только при наведении мыши?

    @Sumor
    Ответ на 4 вопрос:
    Когда деревья были маленькими, а Windows только появилась, то была функция SetActiveWindow, которая делала выбранное окно активным — выбрасывало на первый план. Но программисты любили делать свои окна постоянно активными и вызывали эту функцию слишком часто, от этого иногда система уходила в карусель активных окон. Для предотвращения этого в API Windows появилась функция SetForegroundWindow, которая работает почти также, но в случае частых вызовов окна перестают переключаться, а только начинают мигать в панели задач. Это не особенность компьютеров или программ — это внутренняя кухня. Если система решит, что вы слишком часто переключаетесь - она начнёт просто мигать кнопками.
    Ответ на 3 вопрос:
    Ожидание появление окна — в цикле, по таймеру. Ничего в этом страшного нет. При желании это можно организовать в отдельном потоке.
    Помимо этого есть сложные методы внедрения кода в программу, связанные с хуками приложения или перехватом вызовов функций, но не думаю что ваша задача требует такого сложного вмешательства.
    Ответ на 2 вопрос:
    Видимо у программы так реализован цикл событий, что ваш SendMessage не обработается, пока не придут настоящие события - MOUSE_MOVE, например. Или для диалога нужно текущее активное окно. Или ещё много других подобных причин. Может перед SendMessage должно прийти другое событие.
    В большинстве случаев для имитации действий нужно чтобы окно было активным. Если окно не активное, то имитация в равной степени может работать или не работать.
    Ответ на 1 вопрос:
    Скорее всего меню динамические и создаются по щелчкам мыши и открытию меню. Поэтому вам ничего не остаётся как последовательно имитировать нажатие на меню File, пробег по пунктам меню, и выбор нужного пункта меню — чтобы отработали внутренние механизмы создания подменю.
    Ответ написан
    1 комментарий