Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Есть служба "Сетевая служба" (Fax). При старте она запускает функцию из dll В эту ф-цию я вставил код: Код: plaintext 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. Так вот он вылетает очевидно на CreateProcess. Не удалось запустить службу на Локальный компьютер Ошибка 1067: процесс был неожиданно завершен А в логе видим: 02.27.2017@15:17:25.919: Proga.exe before start. и на этом обрывается что подтверждает вылет именно на CreateProcess, и именно вылет а не FALSE. Что еще: Аналогичный API код в VB.Net с этой же proga.exe под юзер-аккаунтом работает на ура (в том числе если компилировать VB под x64, притом что proga.exe строго Win32). Код: vbnet 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. Еще могу сказать что Proga.exe 32-бит (здесь по другому никак) Сама dll (а также успешный тест на VB.Net) - 64-бит Смысл задачи - получить GetExitCodeProcess(Proga.exe 32-бит ), через dll не получится именно по причине что интересующийся процесс может быть 64 бит, а dll/exe поставляющий информацию (число) строго 32-бит. Вот я не могу понять, что происходит с CreateProcess при вызове из dll-ф-ции, но очевидно что-то не то. Могу еще конечно сделать тоже самое через ShellExecuteEx, но это по сути зеркало того же кода. Глобальная задача в чем. Число девайсов DEVICE_LIMIT -следует из "лицензии", а лицензия - это AsProtect который в моем случае 32-битный и точка. Это число надо как-то вычислить и передать в ф-цию dll (может быть 64-битной) при ее вызове. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 15:52 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
У меня заработал код с ShellExecuteEx Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Заработало, когда явно прописал пути (выделено) А как мне вычислить путь, где физически лежит dll (из которой все это запускается)? На языке .Net это Application.Startup Т.е. у меня dll лежит "C:\\Setup\\FSP\\FSPTest\\FSPTest\\bin\\Debug\\MyDll.dll" А вычислить надо "C:\\Setup\\FSP\\FSPTest\\FSPTest\\bin\\Debug" //папка где она лежит "C:\\Setup\\FSP\\FSPTest\\FSPTest\\bin\\Debug\\Proga.exe" //Proga.exe -лежит в той же папке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 17:12 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Еще есть проблема, что при отсутствии Proga.exe в указанном месте ShellExecuteEx виснет, вместо чтоб вернуть False. Не нравится мне все это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 17:20 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Вот я не могу понять, что происходит с CreateProcess при вызове из dll-ф-ции, но очевидно что-то не то. MSDN читать не пробовал?.. lpCommandLine [in, out] Pointer to a null-terminated string that specifies the command line to execute. The maximum length of this string is 32K characters. The Unicode version of this function, CreateProcessW, will fail if this parameter is a const string . Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 17:32 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Я пока застопорился как путь к папке с моей dll получить Пробую: Код: plaintext 1. 2. 3. Он мне пишет: 02.27.2017@19:09:38.596: szDllPath=C:\WINDOWS\system32\fxssvc.exe Ну, понятно, что хозяин факс-сервер, но у меня то все лежит в другом (одном) месте, мне это место надо вычислить, потому как что в CreateProcess что в ShellExecuteEx надо б полный путь пихать, тем более тек. директория надо думать System32, а не где все лежит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 19:18 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Дмитрий77, а внимательно почитать описание первого параметра GetModuleFileName? авторA handle to the loaded module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process. dll handle - передаётся первым параметром в DllMain ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 19:50 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Изопропил, С этим пока нахожусь на пути к истине: Код: plaintext 1. 2. 3. 4. Но мне не нравится 1) Что я явно должен писать имя GetModuleHandle(L" MyDll.dll "). Она сама не знает как ее зовут? 2) PathRemoveFileSpec которая Depricated и из-за которой пришлось вставлять shlwapi.lib в Компоновщик->Ввод->Доп.зависимости и не знаю насколько это Good. Счас буду StringCchCopy и StringCchCat делать чтоб путь к Proga.exe родить и дай бог все это методом полутыка склеится и типы строк не перепутаются. И на всю эту фигню уйдет вечер. Теперь понимаешь за что я люблю VB и .Net, где у меня есть Application.StartupPath IO.Path.GetDirectoryName(FilePath) IO.Path.Combine(Directory, "Proga.exe") -это не смотря на мое предпочтение API против .Net-классов во многих случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 20:20 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Она сама не знает как ее зовут? знает, хэндл передаётся в DllMain с чего типам строк путаться? используй юникодные. проблема последний бэкслэш в строке найти? не преувеличивай трудности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 20:48 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Изопропил, Ну пока как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Теперь попить кофейку, пересдохнутьвздохнуть и вернуться к CreateProcess/ShellExecuteEx с позиции вымученных полных путей szDllPath/szLicenseFilename. >не преувеличивай трудности Угу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 20:59 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Изопропилхэндл передаётся в DllMain Повтори это ещё пару раз, а то даже со второго раза, похоже, не доходит... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 21:02 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Игра слов видимо. Имеется думаю ввиду, что GetModuleFileName(GetModuleHandle(L"MyDll.dll"), szDllPath, MAX_PATH); точно определит путь, к загруженной dll с именем MyDll.dll, т.е. ошибка как бы исключена и этот код правильный. Сам запутался в попытке что-то описать словами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 21:17 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, а чем прямой путь не устраивает ? Код: plaintext 1. 2. 3. 4. 5. hinstDLL [in] A handle to the DLL module. The value is the base address of the DLL. The HINSTANCE of a DLL is the same as the HMODULE of the DLL, so hinstDLL can be used in calls to functions that require a module handle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 21:22 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77, а чем прямой путь не устраивает ? Код: plaintext 1. 2. 3. Нету у меня такой. Есть вот это (уж не знаю насколько эквивалентно): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Но при попытки замены GetModuleHandle(L"MyDll.dll") на (HINSTANCE)g_hInstance он мне exe-шник в System32 вычисляет Да пофиг, я думаю мой вариант правильный. Хотя они делают зачем-то g_hInstance = hInstance (HINSTANCE->HANDLE) из-за чего мне приходится делать обратное (HINSTANCE)g_hInstance (HANDLE->HINSTANCE) и вот не знаю насколько это законно и не получаю ли я тот же NULL в итоге вместо исходного HINSTANCE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 21:52 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Хотя они делают зачем-то кто такие "они"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 22:07 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Изопропил, "они" это MS, которые в SDK любезно предоставили рыбу этой самой dll, скелет которой я ясно дело не менял, а просто методично подправляю под свою кухню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 22:24 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Есть вот это А ты проверил, что "это" действительно вызывается? А то всё выглядит так, будто бы нет и g_hInstance остаётся равным нулю. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 22:32 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMSDN читать не пробовал?.. lpCommandLine [in, out] Pointer to a null-terminated string that specifies the command line to execute. The maximum length of this string is 32K characters. The Unicode version of this function, CreateProcessW, will fail if this parameter is a const string . Читаем постоянно. Но иногда там слишком много написано. Я не знаю в чем там мистика и почему нельзя просто написать L"bla-bla-bla" но тем не менее (с учетом вычисления полного пути к файлу и указания полного пути к директории где он лежит) код таки завелся и работает: Код: plaintext 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. Причем видимо чуть приглажу и остановлюсь на этом варианте с CreateProcess. Можно заменить на ShellExecuteEx, но там есть проблема. Если Proga.exe отсутствует(файл физически удалили), по логике должен уйти по else и вернуть DEVICE_LIMIT = 0, но почему-то этого не происходит и код виснет (служба запускается бесконечно): (м.б. про какие-то маски/флаги не дочитал) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В случае с CreateProcess "else" корректно отрабатывает при отсутствии файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 22:52 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДмитрий77Есть вот это А ты проверил, что "это" действительно вызывается? А то всё выглядит так, будто бы нет и g_hInstance остаётся равным нулю. Не уверен что вызывается. Как проверить не знаю, лог у меня включается в FaxDevVirtualDeviceCreation - первая ф-ция, вызываемая при старте Fax-службы, там же сразу за стартом лога я вычисляю DEVICE_LIMIT для чего мне и нужен szDllPath Но DllMain точно отсутствует. Ну и бог с ним, раз нашел рабочий способ вычислить szDllPath. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 23:16 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Ну и бог с ним, раз нашел рабочий способ вычислить szDllPath. не хочешь разбираться - готовься наступить на следующие грабли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 23:29 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Но DllMain точно отсутствует.что мешает её написать самому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 23:47 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77Ну и бог с ним, раз нашел рабочий способ вычислить szDllPath. не хочешь разбираться - готовься наступить на следующие грабли Что за грабли меня ожидают? Ну давай я эту DllEntryPoint закомментирую и посмотрю будет ли работать. Предполагаю что будет, хотя не уверен. Глянь на полный код: Код: plaintext 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. Там как бы память очищается, и лог-файл закрывается, так что уже не уверен что оно лишнее и нигде не срабатывает. Все одно задача как бы решена, а двигаться дальше сегодня уже неохота. К списку "заказанных" майкрософтом функций, чье присутствие и внешний вид обязательны: Fax Service Provider Functions она не относится. В SDK примере еще есть например заумные DllRegisterServer/DllUnregisterServer которые нахрен не нужны (потому как вся регистрация/unregistрация - вызов двух API-ф-ций что с комфортом можно сделать и из VB): Код: vbnet 1. 2. 3. 4. 5. Но они (MS) однако нигде не говорят как потом реестр от "девайсов" чистить (после удаления "провайдера"). И в SDK примере этого также нигде нет. Видимо предполагается либо забить на мусор, либо ручками через ф-ции реестра, что вообще говоря гимор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 00:00 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
egorychДмитрий77Но DllMain точно отсутствует.что мешает её написать самому? А зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 00:01 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Дмитрий77egorychпропущено... что мешает её написать самому? А зачем? чтоб от говнокода избавиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 00:09 |
|
||
|
Проблемы с CreateProcess при запуске из-под Win службы
|
|||
|---|---|---|---|
|
#18+
Ну давай я эту DllEntryPoint закомментирую и посмотрю будет ли работать. Предполагаю что будет, хотя не уверен. Закомментировал. На работоспособность не влияет. Не знаю, зачем она там вообще. Изопропилчтоб от говнокода избавиться Говнокод, говнокод. Где говнокод? Это? Код: plaintext 1. MSDNRetrieves a module handle for the specified module. The module must have been loaded by the calling process . Какой модуль должен грузить "calling process" ему четко (вместе с путем) прописано в реестре при регистрации провайдера HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fax\Device Providers\{GUID} "ImageName" А прописываю я туда путь к dll в папке моего приложения. Поэтому случайно загрузить что-то другое (хоть бы это другое с тем же именем в System32 лежит) он не может. Поэтому однозначно вернет требуемый путь (где все мое "хозяйство" и лежит). Не может тут граблей быть. Я понимаю что ты хочешь сказать. Добавить DllMain, которая сработает при Load, а оттуда пихнуть HINSTANCE в Static, откуда взять не вычисляя через GetModuleHandle. Ну, сделал по другому. Только где там грабли и говнокоды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 01:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39411090&tid=2018266]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 538ms |

| 0 / 0 |
