Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Start programmi


Автор: Joh 21.3.2006, 17:09
Privet vsem!
takoj wopros:
kak moshno Message pojmat, kotoraja budet poslana pri starte odnoj levoj programmi? nado proverit pered startom odim parametr.
Esli uslovie =False startuj programmu, esli True togda schtoto vrode Messagebox vidat... (w2k, mogu tolko winapi/ MFC ne mogu)

Автор: Earnest 21.3.2006, 17:54
Модератор: Joh, пользуйся транслитом (галка такая слева есть)
По сути вопроса:
Какое сообщение посылается - известно, надеюсь?
Кому оно посылается? Если это сообщение посылается как вещательное (HWND_BROADCAST), то можно просто поставить его обработчик в своем главном окне.
Если нет (какому-то конкретному окну) - ставь хук на все процессы (т.к. твой "левый" еще не запущен).

Автор: Joh 21.3.2006, 18:52
o, супер функция однако етот транслит smile

Earnest спасибо за быстрий ответ, толъко я ничего не понял smile

блин пока правилъную букву найдешъ !!! мягкий знак не могу найти , поетому (перевернутую букву е тоже) пишу с твердым знакомsmile но не в етом дело...

на десктопе естъ icon при нажатии которого (double_click) стартует программа.
мне нужно каждый раз при старте етой программи проверит, сколъко sessions уже сушествуют на данный момент. если их число превышает допустим 25, то ета программа не должна бытъ происведена...




Автор: Athlon 21.3.2006, 23:24
Рихтер предлагает для этого использовать именованные объекты ядра, например "левая программа" создает такой объект, а твоя при старте проверяет наличие такого объекта:
Цитата

Именованные объекты часто применяются для того, чтобы не допустить запуска нескольких экземпляров одного приложения. Для этого Вы просто вызываете одну из Create-функций в своей функции main или WinMain и создаете некий именованный объект. Какой именно — не имеет ни малейшего значения. Сразу после Create-функции Вы должны вызвать GetLastError Если она вернет ERROR_ALREADY_EXISTS, значит, один экземпляр Вашего приложения уже выполняется и новый его экземпляр можно закрыть. Вот фрагмент кода, иллюстрирующий этот прием:
Код

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow} {
    HANDLE h = CreateMutex(NULL, FALSE, "{FA531CC1-0497-11d3-A180-00105A276C3E}");
    lf (GetLastError() == ERROR_ALREADY_EXISTS){
         // экземпляр этого приложения уже выполняется
         return(0),
    }
    // запущен первый экземпляр данного приложения
    // перед выходом закрываем объект
    CloseHandle(h),
    return(0);
}



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

Автор: Fin 22.3.2006, 00:48
Athlon, Скорее всего, программа не писана автором вопроса и исходников естественно нет. Можно сделать свою прогу-оболочку и линк на Десктопе повесить на нее. В самой проге проверять количество запусков и при выполнении условий запускать уже ту левую прогу.

Автор: Earnest 22.3.2006, 08:40
Цитата(Athlon @ 21.3.2006, 23:24 Найти цитируемый пост)
Sorry поторопился с ответом, этот вариант хорош если нужно чтобы запускалась только одна копия прграммы

Для запуска нескольких копий мьютекс просто заменяется на семафор...

Fin, из вопроса действительно непонятно, есть ли какой-то механизм в "левой" программе. Если она совсем "левая", то предложенный тобою способ все-таки оставляет возможность запустить ее прямо, помимо всякой оболочки. Я думаю, и в этом случае можно написать какой-нибудь монитор, который будет следить за открытием процессов...

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

Автор: Fin 22.3.2006, 16:28
В винде ХР сушествует механизм внедрения во все абсолютно запускаемые процессы своей Dll. Нужно только выставить ключ в реестре. В своей Dll проверять, соответствует ли данный файл условиям. Ну и при несоответствии вырубать процесс.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)