Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает wShowWindow при CreateProcess, si.wShowWindow = SW_SHOW - толку нет 
V
    Опции темы
fridkaratel
Дата 1.3.2008, 21:55 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Приветствую!

Пытаюсь подгрузить dll в другую программу, но скрыть эту программу от глаз, т.е. мне необходимо вообще скрыть программу (как форму, так и чтобы она не была видна на системной панели). Но приложение не консольное, к примеру, блокнот (notepad.exe). Что делаю:

Код

  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  HMODULE hRemoteModule = NULL;
  bool bSuccess = false;
    
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.dwFlags = STARTF_USESHOWWINDOW;
  si.wShowWindow = SW_HIDE;

  if (CreateProcess(NULL, FILE_PROG.c_str(), 0, 0, FALSE, 0, 0, 0, &si, &pi))
  {
    DWORD res = WaitForInputIdle(pi.hProcess, 3000);
    if (res == WAIT_TIMEOUT)
    {
      TerminateProcess(pi.hProcess, 0);
    } else
    {
      LPVOID p = VirtualAllocEx(pi.hProcess, 0, FILE_DLL.Length() + 1, MEM_COMMIT, PAGE_READWRITE);
      if (p)
      {
        if (WriteProcessMemory(pi.hProcess, p, FILE_DLL.c_str(), FILE_DLL.Length() + 1, NULL))
        {
          FARPROC fp = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
          if (fp)
          {
            HANDLE hThread = CreateRemoteThread(pi.hProcess, 0, 0, (LPTHREAD_START_ROUTINE)fp, (LPVOID)p, 0, NULL);
            if (hThread)
            {
              res = WaitForSingleObject(hThread, 3000);

              if (res == WAIT_TIMEOUT)
              {
                TerminateThread(hThread, 0);
              }

              GetExitCodeThread(hThread, (LPDWORD)&hRemoteModule);
              if (hRemoteModule)
              {
                bSuccess = true;
              }
              CloseHandle(hThread);
            }
          }
        }
        VirtualFreeEx(pi.hProcess, p, FILE_DLL.Length() + 1, MEM_FREE);
      }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
  }


Почему-то программа все равно видна... я и так, и сяк... ничего не выходит  Что я не так делаю?

PS: возможен доступ к ресурсам запускаемой программы, т.е. через Restorator можно изменить параметры формы - это както может помочь? Может, изменить какие-нибудь свойства там?

----------------
И еще вопросик... Как корректно закрыть приложение из создаваемого в подключенной DLL потока? Что я делаю - подключаю DLL, при инициализации создаю поток, в котором выполняются действия... После выполнения надо закрыть программу... Но не могу smile
PM   Вверх
fridkaratel
Дата 3.3.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



короче, какой-то глюк... если запускать блокнот таким кодом, который я привел, то все ОК, а если ту прогу, которая мне нужна, то она вообще не реагирует на параметры, передаваемые при создании - запускается видимой - и все тут... в чем может быть дело?
PM   Вверх
586
Дата 3.3.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Программа просто не обрабатывает этот параметр и создаёт окно как ей хочется.
PM   Вверх
fridkaratel
Дата 3.3.2008, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Цитата(586 @  3.3.2008,  09:45 Найти цитируемый пост)
Программа просто не обрабатывает этот параметр и создаёт окно как ей хочется.

как тогда быть? у меня есть доступ к ресурсам программы (напр. через Restorator)... может там что изменить?

PS: где-то читал, что можно изменить какие-то байты в самом exe-шнике, (напр. с 0 на 4), чтобы программа не показывалась... так называемый WS_SHOW на WS_HIDE), но не знаю, что и как... такое можно реализовать и, если можно, то как?
PM   Вверх
586
Дата 3.3.2008, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Я думаю, лучше как-нибудь так:
Код
BOOL CALLBACK WndEnumProc(HWND hWnd, LPARAM lParam)
{
    DWORD pid;
    GetWindowThreadProcessId(hWnd, &pid);
    if(pid == (DWORD)lParam)
    {
        long style = GetWindowLong(hWnd, GWL_STYLE);
        if(!(style & WS_CHILD) && (style & WS_SYSMENU))   // можно производить и другие проверки, чтобы определить, ГЛАВНОЕ ли это окно.
            ShowWindow(hWnd, SW_HIDE);
    }
    return TRUE; // continue enumeration
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    EnumWindows((WNDENUMPROC)WndEnumProc, /*PID*/4064);
}

PM   Вверх
fridkaratel
Дата 3.3.2008, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



скроется ли при этом программа из панели? т.е. она вообще скроется или только форма?
PM   Вверх
586
Дата 3.3.2008, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(fridkaratel @  3.3.2008,  03:05 Найти цитируемый пост)
скроется ли при этом программа из панели? т.е. она вообще скроется или только форма

Скроется, если это окно привязано к панели задач.

Это сообщение отредактировал(а) 586 - 3.3.2008, 03:20
PM   Вверх
fridkaratel
Дата 3.3.2008, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



все ОК! спасибо ;)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.