> Программисты - помогите плиз
 VxWorks Member is Offline
 Posted: 24-08-2010, 19:53 (post 1, #979408)

Daysleeper
Forum moderator
Group: Privileged
Posts: 21936
Warn:0%-----
Задали мне такую вот задачку - написать программу под Винды, которая отслеживает когда пользователь подключает USB хард или мемори стик.
Если такой диск подключен, надо показать менюшку типа "чего дальше делать-то?". Если диск вытащили - сообщение типа "какого хрена, собственно?".

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

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

Прога должна быть сделана до конца недели. Помогите плиз :)
PM
Top Bottom
 Гордый Member is Offline
 Posted: 24-08-2010, 20:10 (post 2, #979413)

proRock
Group: Netlab Soldier
Group: Netlab Soldier
Posts: 25108
Warn:0%-----
А отказаться ты конечно не мог? :diablo:

До конца недели... наверно только содрать код с какого freeware. :drag:
PM
Top Bottom
 VxWorks Member is Offline
 Posted: 24-08-2010, 20:16 (post 3, #979414)

Daysleeper
Forum moderator
Group: Privileged
Posts: 21936
Warn:0%-----
Я там только начал работать (правда, уже по сторонам смотрю, бо надоело всякой х-ней заниматься).

Какую-нибудь бетку сварганить и то хлеб был бы. А тут еще этот чертов Visual Studio, с которым я никогда не работал. Если надо было что-то по-быстрому накропать для Винды, брал C++ Builder.
PM
Top Bottom
 Гордый Member is Offline
 Posted: 24-08-2010, 20:23 (post 4, #979417)

proRock
Group: Netlab Soldier
Group: Netlab Soldier
Posts: 25108
Warn:0%-----
QUOTE (VxWorks @ 24-08-2010, 19:16)
Я там только начал работать (правда, уже по сторонам смотрю, бо надоело всякой х-ней заниматься).

Какую-нибудь бетку сварганить и то хлеб был бы. А тут еще этот чертов Visual Studio, с которым я никогда не работал. Если надо было что-то по-быстрому накропать для Винды, брал C++ Builder.
Похоже они тебя тестируют... так как такая функция есть в принципе в самой винде. ;)
PM
Top Bottom
 VxWorks Member is Offline
 Posted: 24-08-2010, 20:24 (post 5, #979418)

Daysleeper
Forum moderator
Group: Privileged
Posts: 21936
Warn:0%-----
Такая функция есть и даже сигнал есть. Но мне надо как-то этот сигнал связать с прогой. И вот как это сделать - я не знаю.
PM
Top Bottom
 Lord KiRon Member is Offline
 Posted: 24-08-2010, 20:26 (post 6, #979419)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
Как правильно это делать не знаю если честно, по моему там надо отслеживать какой то эвент по басу, но нам когда надо было просто мониторили ветку в регистре.
А вообще предложи им купить прогу с http://safelyremove.com/
PM
Top Bottom
 VxWorks Member is Offline
 Posted: 24-08-2010, 20:43 (post 7, #979423)

Daysleeper
Forum moderator
Group: Privileged
Posts: 21936
Warn:0%-----
Прога мне не поможет. Дело в том, что я должен написать полную замену шелла в Винде (та, которая Embedded). Эмбеднутого там, на самом деле, нифига нет, но шелл сменить можно. И вот руководство хочет чтобы я его написал.
Первую версию-то я написал давно и вроде как даже работает. Но там я не отслеживал USB.
PM
Top Bottom
 Set Member is Offline
 Posted: 24-08-2010, 23:45 (post 8, #979502)

Visionary

Group: Members
Posts: 5181
Warn:0%-----
PM
Top Bottom
 izanoza Member is Offline
 Posted: 25-08-2010, 03:05 (post 9, #979518)

Мышъ с сыром

Group: Prestige
Posts: 5279
Warn:0%-----
Запускаешь процесс как
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;
Проверять через промежуток времени.
PM Email Poster
Top Bottom
 VxWorks Member is Offline
 Posted: 25-08-2010, 20:05 (post 10, #979647)

Daysleeper
Forum moderator
Group: Privileged
Posts: 21936
Warn:0%-----
izanoza

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

Set

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

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