Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Master_Profi
Дата сообщения: 25.09.2011 18:49
bomzzz
ну я понимаю, но как конкретно реализовать это в win32 не знаю. ну предполагаю какой-то цикл вставить, существующий пока существует окно определенного класса(моего приложения),задать в цикле целочисленую переменную, которое считало бы окна, но опять же, что конкретно и как вставить не знаю, пробовал много раз пробовать, но не получалось
Автор: bomzzz
Дата сообщения: 25.09.2011 18:56

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


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

Добавлено:
еще можно так сделать - зарегистрировать всесистемное сообщение. и при запуске посылать его, сколько ответов придет минус один столько копий запущено. только это уже после того как окно нарисовано сработает
Автор: Master_Profi
Дата сообщения: 25.09.2011 23:50
нет, не выходит, попробовал - не получилось, тот же эффект, да даже по логике же - функция FindWindow всегда будет находить окно моего класса, следовательно у меня глобальная переменная будет бесконечной, и это не важно где находится функция, то ли в самой функции main, то ли в какой-то другой, хотя может я что-то не так делал. но мне кажется функцию FindWindow задействовывать не надо..
Автор: bomzzz
Дата сообщения: 25.09.2011 23:55
ну тебе надо по дескриптору класс окна определить, чтоб знать твое оно или нет


Цитата:
Функция 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
Автор: Master_Profi
Дата сообщения: 26.09.2011 01:14
мм, да нет, как же эта функция мне поможет?..
Автор: bomzzz
Дата сообщения: 26.09.2011 01:25
блин. функция енум перечислит тебе все окна которые есть в системе и отправит их дескрипторы по череди в подпрограмму, а в подпрограмме ты по каждому дескриптору GetClassName получишь класс окна и если этот класс твой посчитаешь его, на выходе получишь количество копий программы.
http://vsokovikov.narod.ru/New_MSDN_API/Window/fn_enumwindows.htm
http://vsokovikov.narod.ru/New_MSDN_API/Window/fn_enumwindowsproc.htm

Добавлено:
в СИ логика совсем другая, может надо не так объяснять не знаю
Автор: Master_Profi
Дата сообщения: 26.09.2011 01:58
не заморачивайся, если бы ты работал в С, то выслал бы готовый кусок кода и все, было бы намного проще, описание всех этих функций это одно дело, а использование правильное - совсем другое, ну вот ты мне например написал вот, я попытался все это попробовать, и с определением класса опробовал, не идет, или могу запускать сколько хочу приложений, или запускаю одно, а последующий запуск блокирую, это все что достиг. видно не учел какие-то тонкости. проехали кароче с этой задачей.
Автор: bomzzz
Дата сообщения: 26.09.2011 02:31

Цитата:

.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
Автор: Qraizer
Дата сообщения: 26.09.2011 03:13
Master_Profi, не заморачивайся подсчётом окон.

Цитата:
как запустить 2 экземпляра приложения, а на третий спрашивать запускать ли еще одно??
Умеешь мьютексом разрешать ровно одну копию? Разрешать ровно N копий так же, только мьютекс следуеь заменить на семафор.
Автор: Master_Profi
Дата сообщения: 26.09.2011 08:15
bomzzz впринципе в общей структуре я вот так делал, за исключением нескольки операторов(их вот не до конца понял) и вполне вероятно что дело зависит от нескольких тех операторов, сегодня вечером посмотрю в нэте команды если что, попробую поразобраться, чтоб детальней понять.

Qraizer

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

мм, а вот про такое не знаю кстати, попробую порыться!
Автор: bomzzz
Дата сообщения: 26.09.2011 09:13

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

интересно надо почитать.

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

Добавлено:
может и меньше надо измерять
Автор: Aleksandr N
Дата сообщения: 27.09.2011 17:48
Знатоки С++ подскажите.
Потребовалось перекомпилировать чужую библиотеку. Файл проекта авторский. Использую Microsoft Visual Studio 2010. При использовании директивы /MD для работы библиотеки требуется библиотека MSVCR100.dll. При директиве /MT библиотека MSVCR100.dll не используется, но и библиотека не работает.

Вопрос:
Что необходимо сделать/добавить/изменить в проекте чтобы библиотека использовала файл MSVCRT.dll?
Автор: Molniev
Дата сообщения: 27.09.2011 19:06
Aleksandr N

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

Собрать в 6 студии.

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

Добавлено:
bomzzz
"энергозатратность" способа с перечислением окон очень порадовала)))
Автор: Aleksandr N
Дата сообщения: 27.09.2011 19:30
Molniev

Цитата:
Собрать в 6 студии.

А в 2010 никак? А "6" это MVS 2003 или как?

Как не работает, точно не кажу. Вызываю функцию, а в ответ тишина. Я принципиально хотел избавится от MSVCR100 т.к. это не стандартная библиотека ОС.
Честно говоря, C++ это не моя епархия, решил воспользоваться чужим трудом.
Автор: bomzzz
Дата сообщения: 27.09.2011 20:07

Цитата:
Я принципиально хотел избавится от MSVCR100

положи эту дллку в папаку с программой из папки систем32
Автор: Aleksandr N
Дата сообщения: 27.09.2011 20:13
bomzzz
И это конечно выход. Может как-то можно самим проектом?
Автор: bomzzz
Дата сообщения: 27.09.2011 20:15

Цитата:
"энергозатратность" способа с перечислением окон очень порадовала)))

я как ассемблерный любитель привередливый. для Си програмирования 6000 (условных) тактов не число
условных потому что на самом деле процессор в защищенном режиме разделяет время между процессами, и пока все это выполниться, процессор несколько раз переключится между процессами, а значит тактов затратится гораздо больше, и что оптимизировать код нужно еще прикунуть как данные кода и сам код будут жить в кеше
Добавлено:
Aleksandr N
в смысле самим проектом? я чисто так ляпнул. плохо это тем что придется эту дллку (кстати еще прописанную в реестре) придется подкладывать не ко дной проге а ко всем кто ее использует. можно конечно в реестре путь исправить но тогда это тоже самое что ее в систем32 положить
вот даже в ассемблере, а в ассемблер многие приходят из Си, эту дллку используют
Автор: Aleksandr N
Дата сообщения: 27.09.2011 20:43
bomzzz

Цитата:
в смысле самим проектом?

В смысле поставить какую-нибудь директиву, чтобы использовалась MSVCRT.
Автор: bomzzz
Дата сообщения: 27.09.2011 20:44
система сначала ищет дллку в папке с программой, потом во всем прописанных системных путях. можешь положить в любое место


потом смотрит нет ли ее зарегистрированной в реестре - нет это я соврал, в реестре наверно только считается сколько программ используют эту дллку

Добавлено:
это очень распространенная дллка, очень много софта ее используют - Си самые распространенный язык програмирования, поэтому не вижу ничего страшного положить ее в папку систем32. все равно рано или поздно ты поставишь какую нибудь прогу которая ее туда положит, а ты и не заметишь. она микрософтовская - очень родственная самой винде
Автор: Aleksandr N
Дата сообщения: 27.09.2011 20:52
bomzzz
Ладно, спасибо всем, помозгую на досуге.
Автор: bomzzz
Дата сообщения: 27.09.2011 20:54
http://s2.ipicture.ru/uploads/20110927/5AkU4q4m.png
хотя у меня самого ее нет, но как видишь первую сишную дллку мне подложил драйвер мыши, в первые 15-30 минут после установки системы
Автор: Aleksandr N
Дата сообщения: 27.09.2011 21:23
Сейчас ещё раз взглянул на место проживания проекта. У автора есть поддержка 64-битности. При этом 64-битная библиотека опять использует MSVCRT.dll. Получается она компилировалась никак не в 6-й студии. Тогда опять встаёт тот-же вопрос, может как-то можно принудительно включить MSVCRT в проект?
Автор: bomzzz
Дата сообщения: 28.09.2011 02:05
Master_Profi
Как избежать запуска нескольких экземпляров приложения
http://rsdn.ru/article/baseserv/avins.xml

простой пример на масме, правда только для одного экземпляра
[more]
Q39: Как проверить запущено ли уже наше приложение?

.data
mutex db "Some Your Name",0
.data?
secAttrib SECURITY_ATTRIBUTES <>

.code
    mov secAttrib.nLength,SIZEOF secAttrib
; Владелец я, владелец...
    mov secAttrib.bInheritHandle,TRUE        
    invoke CreateMutex,ADDR secAttrib,1,ADDR mutex
; Существует мьютекс?
    invoke GetLastError                
; Угу... Еще как существует!
     .if eax > 0                    

; MemoBreaker: у меня есть подозрения, что
; надо было бы написать так:
    ;.if sdword ptr eax > 0
; однако и так все работает...

     ; Ыва! Тады выходим...
     invoke ExitProcess,0                
     .endif
    ...


MemoBreaker: такой кусочек помещается в начало программы, и мы можем не волноваться за то, что юзер запустит прогу больше чем один раз.
[/more]
конечно здорово что микрософт позаботился о нас. совершенно непонятно что будет если процесс закончится нештатно и не освободит мьютекс, хотянаверняка и это решено. вообщем можно сделать так: запускать экземпляры приложения как треды одного единственного экземпляра. а один процесс разбереться сколько тредов запущено. наверняка можно еще проще придумать
Автор: Master_Profi
Дата сообщения: 28.09.2011 19:20
bomzzz

Цитата:
Как избежать запуска нескольких экземпляров приложения


Цитата:
Как избежать запуска нескольких экземпляров приложения
http://rsdn.ru/article/baseserv/avins.xml

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

Цитата:
простой пример на масме, правда только для одного экземпляра
Подробнее...

ну для одного экземпляра я сразу мог сделать, это легко) с мьютексом даже не разбирался чесно говоря
вообще очень как по мне очень тупая логика! уж извините, задачи надо давать такие, чтобы их можно было решать...т.е. давать всю необходимую информацию для этого, которая наталкивает на решение, а я вот этого не увидел вообще как бы ( это я про книгу откудого взята эта задача, автор Ганеев - можете посмотреть, 1-ая глава).
Автор: bomzzz
Дата сообщения: 28.09.2011 19:24
я вообще про мьютексы не знал ничего, просто начал читать, там черти сколько сидеть разбираться и хорошей документации нет переведенной
Автор: Master_Profi
Дата сообщения: 28.09.2011 21:56
вот-вот!
Автор: Qraizer
Дата сообщения: 28.09.2011 23:25
О, господи.
Код: HANDLE hMutex = CreateMutex(NULL, FALSE, _T("2B23BB31_663A_4cfc_9C0D_62E123E7899B__startMutex"));

if (WaitForSingleObject(hMutex, 0) == WAIT_TIMEOUT)
{
CloseHandle(hMutex);
return;
}
Автор: bomzzz
Дата сообщения: 28.09.2011 23:55
да очень просто. на мсдн огромная статья, на русский переведенную я ее не нашел. для этих мутноксов не одна апи функция а несколько - это еще несколько статей, привелегии, потом вопрос что будет если процесс закончится а мьютекс не будет освобожден. ну вообще надо понять как это работатет
Автор: karakurt2
Дата сообщения: 29.09.2011 00:55
Рихтера почитай. На русском. Там эти дела классно описаны.
Автор: alls2011
Дата сообщения: 29.09.2011 12:49
Помогите кто сможет.

Есть код такой:


Код:
..........
template <class T, T (*FS)(const char*), const HG_String (*TS)(T)>
class IE_UTILS_API HG_Numeric
{
public:

HG_Numeric();
HG_Numeric(T);
HG_Numeric(const char*);
HG_Numeric(const HG_String&);

HG_Numeric& operator=(T v);

operator T() const;
bool isSet() const;

const HG_String toString() const;

private:

T m_num;
bool m_isSet;
};
....................

//
// HG_Bool
//

typedef HG_Numeric<bool,atob, bool_to_str> HG_Bool;


//
// HG_Char
//

typedef HG_Numeric<char,atoc,char_to_str> HG_Char;


//
// HG_Short
//

typedef HG_Numeric<short,atos,short_to_str> HG_Short;

//
// HG_Double
//
double hg_atof(const char *sz);
typedef HG_Numeric<double,hg_atof,double_to_str> HG_Double;

.................

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.