Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2011, 09:32   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Библиотека и приложение в чужом процессе

Здравствуйте, уважаемые!

Помогите решить проблемму...

Есть библиотека. Она внедряется в чужой процесс, там исполняет второй поток, а поток исполняет
Код:
  Application.Initialize;
  Application.CreateForm(TMainForm,MainForm);
  Application.Run;
Всё работает хорошо. Но только до того момента, как процесс-носитель "попросится выйти". Дальше вылетает ошибка о недопустимом дескрипторе окна.

Как я понял, дело в том, что в процессе крутится два потока, которые считают себя главными. И при завершении процесса "сидят на одном горшке".
Понять я понял, а вот как исправить это - нет.
Помогите пожалуста.

Исходник с простейшим примером в аттаче..
В аттаче лежит:
ДллИньектор - запускает calc.exe с внедренной библиотекой.
Calc.exe - копия обычного виндового колька.
исходники библиотеки.

PS: ExitProcess(0); и прочие "заверШАЛОСТИ" не предлагайте. Процесс-носитель возмущается на такое завершение. Имею ввиду не калькулятор, а тот процесс, для которого это готовится. Lineage II

PPS: Сразу оговорюсь - это не вирусня. Пишу бота для вышеупомянутой "лодва"
Вложения
Тип файла: rar _tmp_2THREAD.rar (515.9 Кб, 24 просмотров)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 22.01.2011, 10:39   #2
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Я решение не предлагаю, а просто спрашиваю. А у вас отдельный поток создается как представитель класса TThread?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 22.01.2011, 19:43   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Да. И после создания приложения - освобождается.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 23.01.2011, 00:03   #4
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Опять же просто дискутирую. Вам обязательно что бы все было по одним процессом?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 23.01.2011, 07:42   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Да, это крайне желательно. Я рассматривал вариант, когда библиотека пихает данные боту по сокету и в мессагах. Но у этих вариантов куча своих минусов. Нужно именно приложение внутри процесса.

Хотя даже не обязательно приложение. Мне нужно, чтоб библиотека могла открыть окно из чужого процесса. Желательно, чтоб это окно можно было создать в дезайн-тайме...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 28.01.2011, 14:35   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

а бы попробовал такое:

Код:
var
  g_saveDllProc: TDLLProc;

// --  --
procedure dllMain(reason: DWORD);
begin
  case (reason) of

    DLL_PROCESS_DETACH: begin
      //
      // вот тут надо послать мессагу Application, чтобы он сделал себе Free();
      // т.к. этот фри должен вызваться не в этом потоке, а в том, в котором Application был создан
      // (как раз в нём сейчас крутится ProcessMessages(), куда и должно приземлиться наше сообщение)
    end;

  end;
  //
  if (assigned(g_saveDllProc)) then
    g_saveDllProc(reason);	// call saved entry point procedure
end;

begin
  // код инициализации DLL
  //
  g_saveDllProc := DllProc; // save exit procedure chain
  DllProc := TDLLProc(@dllMain);	  // install LibExit exit procedure
end.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.02.2011, 07:41   #7
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Видимо, я ещё не проснулся... Не получается Вашим способом...
При закрытии несущего приложения вылетает ошмбка "Неизвестное программное исключение".
Покажите пожалуйста на моем примере...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 05.02.2011, 08:19   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка

в твоем проекте фаилов *.dfm быть не должно?)
VirusN13

Последний раз редактировалось ArtGrek; 05.02.2011 в 08:45.
ArtGrek вне форума Ответить с цитированием
Старый 05.02.2011, 10:59   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Бред несусветный.

Код:
procedure TNewThread.Execute;
begin
  Application.Initialize;  // повторная инициализация одного и того же объекта Application, но уже в ДРУГОМ потоке !
  Application.CreateForm(TMainForm,MainForm);
  Application.Run;
  Terminate; // сам-то понимаешь для чего это и как работает ?)
end;

Последний раз редактировалось Stilet; 05.02.2011 в 15:30.
mss вне форума Ответить с цитированием
Старый 05.02.2011, 11:18   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

mss, вообще в нормальных условиях выполнение до Terminate не дойдет.
точнее дойдет когда оборвется цикл обработки сообщений.(Application.Run)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка доступа при выделении памяти в чужом процессе Neoteric Общие вопросы Delphi 21 06.12.2010 16:50
Приложение "Электронная библиотека" BigBob Помощь студентам 1 21.05.2010 07:17
Нити в процессе JustLikeFar Win Api 6 23.08.2009 17:32
Блокировка функции в процессе ее работы Andr180nag JavaScript, Ajax 2 11.08.2008 18:07
Как программно нажать клавишу в чужом процессе? Sere0ga Win Api 2 27.03.2007 18:43