ШАРИК Опубликовано 30 марта, 2017 Поделиться Опубликовано 30 марта, 2017 Здравствуйте .Я решил сделать такую штуку , типа dll с формой.Когда загружаешь dll в процесс , то создаётся форма , которую я заранее слепил в конструкторе форм. Это я сделал , но когда процесс с dll завершён , то форма всё равно остаётся ((( Как сделать так , чтобы форма закрывалась тогда , когда процесс завершён? Код: Скрытый текст int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { try { Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } Скрытый текст Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 30 марта, 2017 Поделиться Опубликовано 30 марта, 2017 ШАРИК, а ты закрываешь окно, когда закрываешь dll? DLL_PROCESS_DETACH , DLL_THREAD_DETACH https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 30 марта, 2017 Автор Поделиться Опубликовано 30 марта, 2017 38 минуты назад, 2zolo2 сказал: ШАРИК, а ты закрываешь окно, когда закрываешь dll? DLL_PROCESS_DETACH , DLL_THREAD_DETACH https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx я закрываю процесс с dll , которая создаёт окно .Но после этого созданное окно остаётся . Ссылка на комментарий Поделиться на другие сайты Поделиться
Taiwan Опубликовано 31 марта, 2017 Поделиться Опубликовано 31 марта, 2017 22 часа назад, ШАРИК сказал: я закрываю процесс с dll , которая создаёт окно .Но после этого созданное окно остаётся . Конечно не закроется, если нет никаких условий Она сама по себе не закроется - так как форма создается в отдельном потоке. юзай - "Close()" или "Terminate()" или отправляй сообщение форме о её закрытии. тут вариантов хоть одним местом жуй. Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 31 марта, 2017 Автор Поделиться Опубликовано 31 марта, 2017 4 минуты назад, Taiwan сказал: Конечно не закроется, если нет никаких условий Она сама по себе не закроется - так как форма создается в отдельном потоке. юзай - "Close()" или "Terminate()" или отправляй сообщение форме о её закрытии. тут вариантов хоть одним местом жуй. ето и ежу понятно .Как сделать так , чтобы окно принадлежало самому процессу и закрывалось вместе с ним? Ссылка на комментарий Поделиться на другие сайты Поделиться
Taiwan Опубликовано 31 марта, 2017 Поделиться Опубликовано 31 марта, 2017 12 минуты назад, ШАРИК сказал: ето и ежу понятно .Как сделать так , чтобы окно принадлежало самому процессу и закрывалось вместе с ним? Form->Close(); или в крайнем случае Application->Terminate(); Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 1 апреля, 2017 Автор Поделиться Опубликовано 1 апреля, 2017 В 31.03.2017в21:09, Taiwan сказал: Form->Close(); или в крайнем случае Application->Terminate(); Как закрыть я знаю Как сделать закрытие формы вместе с процессом .Только без костылей типа : мониторинг процесса ... Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 1 апреля, 2017 Поделиться Опубликовано 1 апреля, 2017 В 30.03.2017в16:08, ШАРИК сказал: DllEntryPoint .. поток там создай на функцию которая создаст окно Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 1 апреля, 2017 Поделиться Опубликовано 1 апреля, 2017 Еще можно психануть и в dll unload код закрытия формочки и потока поместить. Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 2 апреля, 2017 Автор Поделиться Опубликовано 2 апреля, 2017 17 час назад, keng сказал: Еще можно психануть и в dll unload код закрытия формочки и потока поместить. Ладно .С этим потом .Как мне в dll впихнуть ImGui_ImplDX9_Init(hwnd, g_pd3dDevice); Проблема в том , что я не знаю hwnd окна процесса, в который будет загружена dll. Как можно получить этот Hwnd ? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 4 минуты назад, ШАРИК сказал: Как можно получить этот Hwnd ? HWND hWnd = GetForegroundWindow(); Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 2 апреля, 2017 Автор Поделиться Опубликовано 2 апреля, 2017 Только что, partoftheworlD сказал: HWND hWnd = GetForegroundWindow(); Но смысл ?Ведь когда я инжектирую dll в процесс , то главным окном является окно инжектора Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 (изменено) 11 минуту назад, ШАРИК сказал: Но смысл ? Упакуй это на нажатие клавиши, после инжекта перейдешь к игре, нажмешь кнопку и получишь hwnd который тебе нужен. Да-да костыли, но первое что пришло в голову. Можешь еще перебрать окна через EnumWindows. Изменено 2 апреля, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 2 апреля, 2017 Автор Поделиться Опубликовано 2 апреля, 2017 15 минуту назад, partoftheworlD сказал: Упакуй это на нажатие клавиши, после инжекта перейдешь к игре, нажмешь кнопку и получишь hwnd который тебе нужен. Да-да костыли, но первое что пришло в голову. Можешь еще перебрать окна через EnumWindows. Проще уже будет найти D3DPRESENT_PARAMETERS в памяти процесса .Он где-то рядом с LPDIRECT3DDEVICE9(по моему мнению...). Найдя его можно получить hwnd окна с девайсом ... Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 CreateToolhelp32Shapshot и вперед, бегать по списку и искать по имени модуля. Дальше уже по ProcessID вытащить. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 28 минуты назад, keng сказал: CreateToolhelp32Shapshot и вперед, бегать по списку и искать по имени модуля. Дальше уже по ProcessID вытащить. в длл такая движуха не норм. GetCurrentProcessId ок Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 1 hour ago, gmz said: в длл такая движуха не норм. GetCurrentProcessId ок Вариантов много, в любом случае. Мне было бы проще заранее выяснить hwnd и уже в dll передавать. Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 3 апреля, 2017 Автор Поделиться Опубликовано 3 апреля, 2017 Как жаль , что никто меня даже не хочет понимать ...dll может быть загружена в разные процессы .У которых окна с разными названиями и количество их может быть больше 10...Будь всё так просто ,как вы думаете, стал бы я спрашивать ? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 29 minutes ago, ШАРИК said: Как жаль , что никто меня даже не хочет понимать ...dll может быть загружена в разные процессы .У которых окна с разными названиями и количество их может быть больше 10...Будь всё так просто ,как вы думаете, стал бы я спрашивать ? ЩИТО? Ты засовываешь dll в процесс. У процесса есть process id. У процесса может быть окно(а). У каждого есть handle. При этом, если графика в процессе рисуется через Direct3D, то она может проинициализироваться только один раз. Это первое. Второе - у каждого окна есть как минимум класс и заголовок, которые можно найти. При всем при этом у игр в 99% случаев окно только одно, так что я не понимаю, в чем проблема. Находишь process id из dll, по process id находишь handle окна, сообщаешь его обратно dll, готово. [GetCurrentProcessId] ; Получаем идентификатор текущего процесса [EnumWindows] ; Получаем список всех окон [GetWindowThreadProcessId] ; Если идентификатор процесса окна совпадает с тем, что мы нашли ранее, то это нужный нам window handle Готово! Не очень красиво, но винда не предоставляет адекватных механизмов для подобных извращений. P.S.: В чем проблема посидеть часик и поразмышлять или просто погуглить? Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 3 апреля, 2017 Автор Поделиться Опубликовано 3 апреля, 2017 (изменено) 36 минуты назад, keng сказал: ЩИТО? Игра браузерная .Браузеров много .Да и ведь у одного потока может быть несколько окон или нет? и - уберите ПАЖАЛУСТА Изменено 3 апреля, 2017 пользователем ШАРИК Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 11 minutes ago, ШАРИК said: Игра браузерная .Браузеров много С этого нужно было начинать. Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 ШАРИК, а браузерка использует флеш,юнити или джава? Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 3 апреля, 2017 Автор Поделиться Опубликовано 3 апреля, 2017 Только что, 2zolo2 сказал: ШАРИК, а браузерка использует флеш,юнити или джава? Unity Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 Так через CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, TH32CS_SNAPMODULE(MODULEENTRY32>szModule, MODULEENTRY32>th32ProcessID)) перебираешь все процессы и находишь dll webplayer_win, и выводишь их, если их несколько. Ссылка на комментарий Поделиться на другие сайты Поделиться
ШАРИК Опубликовано 3 апреля, 2017 Автор Поделиться Опубликовано 3 апреля, 2017 (изменено) 19 минуту назад, 2zolo2 сказал: Так через CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, TH32CS_SNAPMODULE(MODULEENTRY32>szModule, MODULEENTRY32>th32ProcessID)) перебираешь все процессы и находишь dll webplayer_win, и выводишь их, если их несколько. Не .Всё равно не то...Тут наверно надо перехватить функцию девайса , в которой есть hwnd .То есть present . Перебор окон тут не зарешает крч. Изменено 3 апреля, 2017 пользователем ШАРИК Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения