Перейти к содержанию

c++ builder(dll с формой)


Рекомендуемые сообщения

Здравствуйте .Я решил сделать такую штуку , типа 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;
}

 

Скрытый текст

uBG0WCk27gU.jpg9NeJGTd23Pk.jpg

 

 

Ссылка на комментарий
Поделиться на другие сайты

38 минуты назад, 2zolo2 сказал:

ШАРИК, а ты закрываешь окно, когда закрываешь dll?

 

DLL_PROCESS_DETACH ,  DLL_THREAD_DETACH

 

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

я закрываю процесс с dll , которая создаёт окно .Но после этого созданное окно остаётся .

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, ШАРИК сказал:

я закрываю процесс с dll , которая создаёт окно .Но после этого созданное окно остаётся .

Конечно не закроется, если нет никаких условий:-D Она сама по себе не закроется - так как форма создается в отдельном потоке. юзай - "Close()" или "Terminate()" или отправляй сообщение форме о её закрытии. тут вариантов хоть одним местом жуй.

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Taiwan сказал:

Конечно не закроется, если нет никаких условий:-D Она сама по себе не закроется - так как форма создается в отдельном потоке. юзай - "Close()" или "Terminate()" или отправляй сообщение форме о её закрытии. тут вариантов хоть одним местом жуй.

ето и ежу понятно .Как сделать так , чтобы окно принадлежало самому процессу и закрывалось вместе с ним?

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, ШАРИК сказал:

ето и ежу понятно .Как сделать так , чтобы окно принадлежало самому процессу и закрывалось вместе с ним?

Form->Close(); или в крайнем случае Application->Terminate();

Ссылка на комментарий
Поделиться на другие сайты

В 31.03.2017в21:09, Taiwan сказал:

Form->Close(); или в крайнем случае Application->Terminate();

Как закрыть я знаю :D Как сделать закрытие формы вместе с процессом .Только без костылей типа : мониторинг процесса ...

Ссылка на комментарий
Поделиться на другие сайты

17 час назад, keng сказал:

Еще можно психануть и в dll unload код закрытия формочки и потока поместить.

Ладно .С этим потом .Как мне в dll впихнуть  ImGui_ImplDX9_Init(hwnd, g_pd3dDevice);  Проблема в том , что я не знаю hwnd окна процесса, в который будет загружена dll.
Как можно получить этот Hwnd ?

Ссылка на комментарий
Поделиться на другие сайты

Только что, partoftheworlD сказал:

HWND hWnd = GetForegroundWindow();

Но смысл ?Ведь когда я инжектирую dll в процесс , то главным окном является окно инжектора

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, ШАРИК сказал:

Но смысл ?

Упакуй это на нажатие клавиши, после инжекта перейдешь к игре, нажмешь кнопку и получишь hwnd который тебе нужен. Да-да костыли, но первое что пришло в голову. Можешь еще перебрать окна через EnumWindows.

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

15 минуту назад, partoftheworlD сказал:

Упакуй это на нажатие клавиши, после инжекта перейдешь к игре, нажмешь кнопку и получишь hwnd который тебе нужен. Да-да костыли, но первое что пришло в голову. Можешь еще перебрать окна через EnumWindows.

Проще уже будет найти D3DPRESENT_PARAMETERS в памяти процесса .Он где-то рядом с LPDIRECT3DDEVICE9(по моему мнению...). Найдя его можно получить hwnd окна с девайсом ...

Ссылка на комментарий
Поделиться на другие сайты

28 минуты назад, keng сказал:

CreateToolhelp32Shapshot и вперед, бегать по списку и искать по имени модуля. Дальше уже по ProcessID вытащить.

в длл такая движуха не норм. GetCurrentProcessId ок

 

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, gmz said:

в длл такая движуха не норм. GetCurrentProcessId ок

 

Вариантов много, в любом случае. Мне было бы проще заранее выяснить hwnd и уже в dll передавать.

Ссылка на комментарий
Поделиться на другие сайты

Как жаль , что никто меня даже не хочет понимать ...dll может быть загружена в разные процессы .У которых окна с разными названиями и количество их может быть больше 10...Будь всё так просто ,как вы думаете, стал бы я спрашивать ?:blink:

Ссылка на комментарий
Поделиться на другие сайты

29 minutes ago, ШАРИК said:

Как жаль , что никто меня даже не хочет понимать ...dll может быть загружена в разные процессы .У которых окна с разными названиями и количество их может быть больше 10...Будь всё так просто ,как вы думаете, стал бы я спрашивать ?:blink:

 

ЩИТО? Ты засовываешь dll в процесс. У процесса есть process id. У процесса может быть окно(а). У каждого есть handle. При этом, если графика в процессе рисуется через Direct3D, то она может проинициализироваться только один раз. Это первое. Второе - у каждого окна есть как минимум класс и заголовок, которые можно найти. При всем при этом у игр в 99% случаев окно только одно, так что я не понимаю, в чем проблема. Находишь process id из dll, по process id находишь handle окна, сообщаешь его обратно dll, готово.

 

[GetCurrentProcessId; Получаем идентификатор текущего процесса

[EnumWindows; Получаем список всех окон

[GetWindowThreadProcessId; Если идентификатор процесса окна совпадает с тем, что мы нашли ранее, то это нужный нам window handle

 

Готово! Не очень красиво, но винда не предоставляет адекватных механизмов для подобных извращений.

 

P.S.: В чем проблема посидеть часик и поразмышлять или просто погуглить? :(

Ссылка на комментарий
Поделиться на другие сайты

36 минуты назад, keng сказал:

ЩИТО?

Игра браузерная .Браузеров много .Да и ведь у одного потока может быть несколько окон или нет? и - уберите ПАЖАЛУСТА

Изменено пользователем ШАРИК
Ссылка на комментарий
Поделиться на другие сайты

Так через CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, TH32CS_SNAPMODULE(MODULEENTRY32>szModule, MODULEENTRY32>th32ProcessID)) перебираешь все процессы и находишь dll webplayer_win, и выводишь их, если их несколько.

Ссылка на комментарий
Поделиться на другие сайты

19 минуту назад, 2zolo2 сказал:

Так через CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, TH32CS_SNAPMODULE(MODULEENTRY32>szModule, MODULEENTRY32>th32ProcessID)) перебираешь все процессы и находишь dll webplayer_win, и выводишь их, если их несколько.

Не .Всё равно не то...Тут наверно надо перехватить функцию девайса , в которой есть hwnd .То есть present .
Перебор окон тут не зарешает крч.

Изменено пользователем ШАРИК
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.