Forums -> Флейм -> Программисты - помогите плиз
| Full Version

VxWorks
Задали мне такую вот задачку - написать программу под Винды, которая отслеживает когда пользователь подключает USB хард или мемори стик.
Если такой диск подключен, надо показать менюшку типа "чего дальше делать-то?". Если диск вытащили - сообщение типа "какого хрена, собственно?".

Кроме того, программулина при старте должна запускать другую программу и отслеживать ее состояние. Если пользователь ее закрыл, то надо ее перезапустить. Запустить-то просто, а вот отслеживать... В Юниксах достаточно просто (раз в секунду проверять хэндлер процесса на живучесть), а в Винде как?

Я в этом ни в зуб ногой, поскольку всегда писал софт без операционки вообще на всяческих микропроцессорах. А тут такое...

Прога должна быть сделана до конца недели. Помогите плиз :)
Гордый
А отказаться ты конечно не мог? :diablo:

До конца недели... наверно только содрать код с какого freeware. :drag:
VxWorks
Я там только начал работать (правда, уже по сторонам смотрю, бо надоело всякой х-ней заниматься).

Какую-нибудь бетку сварганить и то хлеб был бы. А тут еще этот чертов Visual Studio, с которым я никогда не работал. Если надо было что-то по-быстрому накропать для Винды, брал C++ Builder.
Гордый
QUOTE (VxWorks @ 24-08-2010, 19:16)
Я там только начал работать (правда, уже по сторонам смотрю, бо надоело всякой х-ней заниматься).

Какую-нибудь бетку сварганить и то хлеб был бы. А тут еще этот чертов Visual Studio, с которым я никогда не работал. Если надо было что-то по-быстрому накропать для Винды, брал C++ Builder.
Похоже они тебя тестируют... так как такая функция есть в принципе в самой винде. ;)
VxWorks
Такая функция есть и даже сигнал есть. Но мне надо как-то этот сигнал связать с прогой. И вот как это сделать - я не знаю.
Lord KiRon
Как правильно это делать не знаю если честно, по моему там надо отслеживать какой то эвент по басу, но нам когда надо было просто мониторили ветку в регистре.
А вообще предложи им купить прогу с http://safelyremove.com/
VxWorks
Прога мне не поможет. Дело в том, что я должен написать полную замену шелла в Винде (та, которая Embedded). Эмбеднутого там, на самом деле, нифига нет, но шелл сменить можно. И вот руководство хочет чтобы я его написал.
Первую версию-то я написал давно и вроде как даже работает. Но там я не отслеживал USB.
Set
http://msdn.microsoft.com/en-us/library/aa363431%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/348b2484%28VS.80%29.aspx
izanoza
Запускаешь процесс как
CODE
intptr_t pid = spawnv(mode, cmdname, args);

где первый параметр одно из: P_WAIT, P_NOWAIT, P_DETACH.
Если запускать процесс в моде P_WAIT, то твоя программа зависнет пока не завершится запущенная. Остальные 2 отвязывают запущенный процесс. Вместо spawnv() можно использовать любую сишную posix функцию spawn*(), ну или напрямую использовать WIN32API -- ::CreateProcess().

spawnv() возвращает пид, а не хэндл, как CreateProcess(), поэтому методы проверки на живучесть разные:

Для CreateProcess():

CODE
    DWORD status = 0;
    ::GetExitCodeProcess(hProcess, &status);
    return status == STILL_ACTIVE;

Для spawn*() всё тоже, но сначала надо получить хэндл:

CODE
    HANDLE hProcess = 0;
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
                              FALSE, (DWORD)pid);
    if (!hProcess) {
        return GetLastError() == ERROR_ACCESS_DENIED;
    }
    DWORD status = 0;
    ::GetExitCodeProcess(hProcess, &status);
    return status == STILL_ACTIVE;
Проверять через промежуток времени.
VxWorks
izanoza

Спасибо. Я, кстати, и так запускал процесс через spawn с P_NOWAIT. Только не догадался как этот pid правильно использовать. :wall:

Set

С USB я уже разобрался, оказалось очень просто. Надо было отслеживать DBT_DEVICEARRIVAL и DBT_DEVICEREMOVAL. В итоге все работает без проблем.

Всем спасибо за помощь. Прога работает, босс счастлив до охренения. Лучше бы он лицензию на Visual C++ купил, а то редактировать ресурсы вручную (так в Express) несколько муторно.