Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
     
    это четыре разных окна со своими декрипторами
     
    Добавлено:
    я на масм32 программы пишу, больше ничего сказать не могу - возможно в С студии есть какой то готовый струмент для этого всего, я могу только сказать как это сделать "ручками"
     
    Добавлено:

    Цитата:
     
    LOCAL    ti:TOOLINFO
    ****************
    invoke EnumChildWindows,hWndIPAddress,addr EnumChild,addr ti
    ****************
           EnumChild proc uses edi hwndChild:DWORD,lParam:DWORD
    invoke TooltipProc,ThreadID,hwndChild,addr ipcontroller
               ret
           EnumChild endp
     

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 13:22 25-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    мм...мне нужно на win32 ...мне надо туда вклинить, вот такой код вообще впервые вижу, даже в примерах такого не встречал..

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 13:53 25-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    это на MASM32, а не на С. суть то передает, я постоянно примеры на С нахожу и смотрю, понятно же как работает
     
    Добавлено:
    к тому же на масме мало народу програмируют, а на С много. поэтому ответ на вопрос проще найти у С программистов
     
    Добавлено:
    только синтаксисом отличается, а апи функции теже самые.

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 13:57 25-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всеравно не понимаю...ладно...

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 16:01 25-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну принцип главное понять. вот когда мы используем поиск файла, мы сначала ищем первый. а потом следующий, и каждый раз нам функция возвращает следующий файл. а тут немного не так, функция выдает сразу весь список, только для каждого вызывает подпрограмму и передает ей дескриптор окна.
     
    Добавлено:
    то есть тебе надо задать подпрограмму которая будет просто считать сколько раз ее вызвали да и все.

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:07 25-09-2011
    Red Planet



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Molniev, спасибо. Дело было в const_iterator.
    Цитата:
    Лишние проверки (а иногда совсем не лишние), позволяющие снизить вероятность ошибок. Особенно при вторичном использовании кода)).
    Не заработала такая проверка у меня. Но и вылетов с ошибками не было. Сортируется, пустые списки идут вперед. Да и сделал я проверки по-другому, при попытке сортировать по индексу, превышающему допустимый, сортируется по последнему. Вот код.
    Код:
    class SortByAny {
        int elemNumber;
        public: SortByAny(int);
        int getElemNumber() const { return elemNumber; }
        bool operator()(const list<int> &, const list<int> &);
    };
     
    bool hasEmpty(const vector< list<int> > &);
    int listMinSize(const vector< list<int> > &);
     
    // ---------------------------------------------------------------------------
    int _tmain (int argc, _TCHAR* argv[]) {
        system ("title Temp");
     
        SortByAny s(6);
        vector< list<int> > v(4, list<int>());
        v[0].push_back(12);
        v[0].push_back(79);
        v[0].push_back(5);
        v[1].push_back(7);
        v[1].push_back(2);
        v[1].push_back(25);
        v[2].push_back(3);
        v[2].push_back(5);
        v[2].push_back(1);
        v[3].push_back(2);
        v[3].push_back(3);
        v[3].push_back(5);
        v[3].push_back(1);
        v[3].push_back(2);
     
        cout <<"Before sort." << endl;
        for (int i = 0; i < v.size(); i++) {
            for (list<int>::iterator it = v[i].begin(); it != v[i].end(); ++it)
                cout << *it << "\t";
            cout << endl;
        }
     
        if (s.getElemNumber() > listMinSize(v))
            s = SortByAny(listMinSize(v)-1);
     
        if (!hasEmpty(v)) {
            cout << endl << "Min. list size: " << listMinSize(v) << endl
            << "Coloumn sort by: " << s.getElemNumber() << endl
            << "After sort." << endl;
            sort(v.begin(), v.end(), s);
            for (int i = 0; i < v.size(); i++) {
                for (list<int>::iterator it = v[i].begin(); it != v[i].end(); ++it)
                    cout << *it << "\t";
                cout << endl;
            } // for.
        } // if.
        else
            cout << "Error! There are empty lists in vector. Fill them. " << endl;
     
        system ("pause");
        return 0;
    }
     
    // ---------------------------------------------------------------------------
     
    SortByAny::SortByAny(int newNumber) {
        if (newNumber >= 0)
            elemNumber = newNumber;
        else
            elemNumber = -newNumber;
    }
     
    bool SortByAny::operator ()(const list<int> &left, const list<int> &right) {
        list<int>::const_iterator lit = left.begin();
        list<int>::const_iterator rit = right.begin();
        if (left.size() == 0) return true;
        if (right.size() == 0) return false;
        for (int i = 0; i < elemNumber; i++) {
            lit++;
            rit++;
        }
        return *lit < *rit;
    }
     
    int listMinSize(const vector< list<int> > &vl) {
        int minSize = vl[0].size();
        for (int i = 1; i < vl.size(); i++)
            if (vl[i].size() < minSize)
                minSize = vl[i].size();
     
        return minSize;
    }
     
    bool hasEmpty(const vector< list<int> > &vl) {
        for (int i = 0; i < vl.size(); i++)
            if (vl[i].empty())
                return true;
        return false;
    }

    Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 17:20 25-09-2011 | Исправлено: Red Planet, 21:01 26-09-2011
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    del

    Всего записей: 3297 | Зарегистр. 30-12-2007 | Отправлено: 18:58 25-09-2011 | Исправлено: lorents, 08:42 26-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bomzzz
    ну я понимаю, но как конкретно реализовать это  в win32 не знаю. ну предполагаю какой-то цикл вставить, существующий пока существует окно определенного класса(моего приложения),задать в цикле целочисленую переменную, которое считало бы окна, но опять же, что конкретно и как вставить не знаю, пробовал много раз пробовать, но не получалось

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 19:49 25-09-2011 | Исправлено: Master_Profi, 19:51 25-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Функция EnumWindows перечисяет все окна переднего плана на экране, передавая по очереди дескриптор каждого окна в определенную приложением функцию обратного вызова. EnumWindows выполняется до тех пор, пока не перечислено последнее окно переднего плана, или пока функция обратного вызова не вернет FALSE.

     
    всосал, только вот будет ли она скрытые и свернутые окна казать - тебе надо сделать так, вызываешь фукцию EnumWindows , а в подпрограмме которую EnumWindows вызывает, фукция FindWindow по переданному дескриптору EnumWindows будет проверять класс окна и если этот класс твой - переводить глобальный счетчик
     
    Добавлено:
    еще можно так сделать - зарегистрировать всесистемное сообщение. и при запуске посылать его, сколько ответов придет минус один столько копий запущено. только это уже после того как окно нарисовано сработает

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:56 25-09-2011 | Исправлено: bomzzz, 20:09 25-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    нет, не выходит, попробовал - не получилось, тот же эффект, да даже по логике же - функция FindWindow всегда будет находить окно моего класса, следовательно у меня глобальная переменная будет бесконечной, и это не важно где находится функция, то ли в самой функции main, то ли в какой-то другой, хотя может я что-то не так делал. но мне кажется функцию FindWindow задействовывать не надо..

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 00:50 26-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну тебе надо по дескриптору класс окна определить, чтоб знать твое оно или нет
     

    Цитата:
    Функция FindWindow
     
    Функция FindWindow извлекает дескриптор окна верхнего уровня, имя класса и имя окна которого соответствуют заданным строкам. Эта функция не ищет дочерние окна. Эта функция не выполняет регистрозависимый поиск.
    Чтобы найти дочерние окна, начинающиеся с заданного дочернего окна, используют функцию FindWindowEx

    http://vsokovikov.narod.ru/New_MSDN_API/Window/fn_findwindow.htm
     
    Добавлено:
    да соврал маленько

    Цитата:
    INVOKE FindWindow,0,ADDR MyFile
    INVOKE GetClassName, EAX, ADDR buffer, valsize

    GetClassName - вот ета фукция тебе надо
     
    http://vsokovikov.narod.ru/New_MSDN_API/Win_class/fn_getclassname.htm

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 00:55 26-09-2011 | Исправлено: bomzzz, 01:14 26-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    мм, да нет, как же эта функция мне поможет?..

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 02:14 26-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    блин. функция енум перечислит тебе все окна которые есть в системе и отправит их дескрипторы по череди в подпрограмму, а в подпрограмме ты по каждому дескриптору GetClassName получишь класс окна и если этот класс твой посчитаешь его, на выходе получишь количество копий программы.
    http://vsokovikov.narod.ru/New_MSDN_API/Window/fn_enumwindows.htm
    http://vsokovikov.narod.ru/New_MSDN_API/Window/fn_enumwindowsproc.htm
     
    Добавлено:
    в СИ логика совсем другая, может надо не так объяснять не знаю

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 02:25 26-09-2011 | Исправлено: bomzzz, 02:46 26-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    не заморачивайся, если бы ты работал в С, то выслал бы готовый кусок кода и все, было бы намного проще, описание всех этих функций это одно дело, а использование правильное - совсем другое, ну вот ты мне например написал вот, я попытался все это попробовать, и с определением класса опробовал, не идет, или могу запускать сколько хочу приложений, или запускаю одно, а последующий запуск блокирую, это все что достиг. видно не учел какие-то тонкости. проехали кароче с этой задачей.

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 02:58 26-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
     
    .386
    .model flat, stdcall
    option casemap:none
     
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
     
    EnumProc    PROTO WORD,:DWORD
     
    .data
    cLassName    db 'BomzWinClass',0
    form        db 'Count: %u%',0
     
    .data?
    string        db 32 dup(?)
    count        dd ?
     
    .code
    start:
     
    invoke EnumWindows, addr EnumProc, NULL
    invoke wsprintf,addr string,addr form,count
    invoke MessageBox,0,addr string,addr cLassName,MB_OK + MB_ICONASTERISK
    invoke ExitProcess, 0
     
    EnumProc proc hwnd:HWND, lParameter:DWORD
    LOCAL    buffer[512]:BYTE
     
        invoke GetClassName, hwnd, addr buffer, sizeof buffer
        invoke lstrcmp, addr buffer, addr cLassName
        cmp eax ,0
        jnz @F
        add count, 1
    @@:
        mov eax, 1
        ret
    EnumProc endp
     
    end start
     

     
    я видел что тебе никто не отвечает - написал принцип. я не думал что так получится, дождись завтра сишники проснутся напишут тебе. у меня работает. я всегда винете нахожу сишные коды потому что на масме их мало и все понимаю
     
    Добавлено:
    http://s1.ipicture.ru/uploads/20110926/Rgtc8u4G.gif

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 03:31 26-09-2011 | Исправлено: bomzzz, 09:38 26-09-2011
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Master_Profi, не заморачивайся подсчётом окон.

    Цитата:
     как запустить 2 экземпляра приложения, а на третий спрашивать запускать ли еще одно??  
    Умеешь мьютексом разрешать ровно одну копию? Разрешать ровно N копий так же, только мьютекс следуеь заменить на семафор.

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 04:13 26-09-2011
    Master_Profi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bomzzz впринципе в общей структуре я вот так делал, за исключением нескольки операторов(их вот не до конца понял) и вполне вероятно что дело зависит от нескольких тех операторов, сегодня вечером посмотрю в нэте команды если что, попробую поразобраться, чтоб детальней понять.
     
    Qraizer

    Цитата:
    Умеешь мьютексом разрешать ровно одну копию? Разрешать ровно N копий так же, только мьютекс следуеь заменить на семафор.

    мм, а вот про такое не знаю кстати, попробую порыться!

    Всего записей: 68 | Зарегистр. 13-11-2010 | Отправлено: 09:15 26-09-2011
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Умеешь мьютексом разрешать ровно одну копию?

    интересно надо почитать.
     
    наверняка должны быть способы более эффективные, способ с перебором окон достаточно энергозатратный, даже на абсолютно пустом рабочем столе с запущенной и висящими в трее мазилой и квипом у меня оказалось аж 96 окон, а для каждого вызывается подпрограмма, апи функция и еще сравнение строк это минимум 600 тактов процессора для каждого окна
     
    Добавлено:
    может и меньше надо измерять

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 10:13 26-09-2011
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Знатоки С++ подскажите.
    Потребовалось перекомпилировать чужую библиотеку. Файл проекта авторский. Использую Microsoft Visual Studio 2010. При использовании директивы /MD для работы библиотеки требуется библиотека MSVCR100.dll. При директиве /MT библиотека MSVCR100.dll не используется, но и библиотека не работает.
     
    Вопрос:
    Что необходимо сделать/добавить/изменить в проекте чтобы библиотека использовала файл MSVCRT.dll?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 18:48 27-09-2011
    Molniev

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N

    Цитата:
    Что необходимо сделать/добавить/изменить в проекте чтобы библиотека использовала файл MSVCRT.dll?

    Собрать в 6 студии.
     
    А вообще вы не указали в чем именно заключена неработоспособность.
    Единственный вариант, который приходит в голову - память выделяется/освобождается в этой библиотеке а освобождается/выделяется вне её. Это ошибка проектирования самой библиотеки и надо просто скорректировать её работу, исправив это поведение.
     
    Добавлено:
    bomzzz
    "энергозатратность" способа с перечислением окон очень порадовала)))

    Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 20:06 27-09-2011 | Исправлено: Molniev, 20:34 27-09-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru