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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание плагина в виде DLL на основе кода от EXE, Как правильно запихнуть код от EXE в DLL 
:(
    Опции темы
Dem_max
Дата 12.1.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ИМЕЕМ:
1. Имеется код для EXE.
2. При запуске EXE запускается окно приложения с параметром SW_HIDE и сразу сворачивается в трей.
3. Имеются 2 проекта (DLL и EXE) которые используют один и тот же код EXE (совместное использование одних и тех же файлов).Это нужно чтобы ошибки и исправления сразу изменялись в 2 проетах, без всяких там копирований файлов и вставок кода Ctrl+V.
4. Приложение использует системный трей.
5. в EXE обязательно присутствует манифест XP, который делает интерфейс программы правильным.

НУЖНО:
Нужно создать плагин в виде DLL на основе кода от EXE.
Функция DLL по инициализации плагина должна запускать код от EXE в основном процессе DLL, а не отдельный файл EXE !!!
И при выгрузке DLL код от EXE должен тоже выгружаться. Пока работает основная программа загрузившая плагин - DLL, код от EXE работает и отображает свое состояние в трее, как только основная программа вызвавшая плагин закрывается все выгружается.

собственно попробовал таким способом все реализовать код DLL (код привел упрощенный):

Код
 #define DLL_PLUG


#ifdef DLL_PLUG
HANDLE hThreadShow;

DWORD WINAPI ShowThread(LPVOID lpParameter);

HINSTANCE hDLL;

extern "C" __declspec(dllexport) int __stdcall LoadPlug(void);
extern "C" __declspec(dllexport) int __stdcall ShowSettings(void);
extern "C" __declspec(dllexport) int __stdcall ClosePlug(void);

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
    switch (fwdreason)
    {
      case DLL_PROCESS_ATTACH: hDLL = hinstDLL;
            break;
      case DLL_PROCESS_DETACH :
            break;
    }
    return 1;
}

int __stdcall LoadPlug(void)
{
   hThreadShow = CreateThread(NULL, 0, ShowThread, NULL, 0, NULL);
   return 0;
}

int __stdcall ShowSettings(void)
{
   ShowWindow(hWndMain, SW_SHOW);
   SetForegroundWindow(hWndMain);
   return 0;
}

int __stdcall ClosePlug(void)
{
   CloseAllResource(); // в этой функции Destroy главного окна приложения.
   return 0;
}

DWORD WINAPI ShowThread(LPVOID lpParameter)
{
   WinMain(hDLL, NULL, NULL, NULL);
   return 0;
}

#endif


int WINAPI WinMain(HINSTANCE HInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   CreateInterface(HInstance);

   MSG  msg;
   while(GetMessage(&msg, NULL, 0, 0))
   {
      if(!IsDialogMessage(hWndMain, &msg))
      {
         TranslateMessage(&msg);
         DispatchMessage (&msg);
      }
   }

   return 0;
}


в общем то так то работает но есть одно НО !!!

поскольку это DLL то манифест XP в процессе не участвует и вместо нужного интерфейса:
user posted image
получается так:
user posted image
Если основная программа имеет этот самый манифест XP то проблем таких нету.
Но в качестве этой основной программы могут быть разные приложения в том числе и без манифеста XP.
Тогда получается как на 2 рисунке.
Есть пути решения данной проблемы ?

Или есть другие пути создания DLL ? из готового кода EXE с помощью модификаций исходного кода директивами
#ifdef DLL_PLUG
#endif
наподобии такого


Код
      case IDB_CLOSE:
      {
         #ifdef DLL_PLUG
         ShowWindow(hwnd, SW_HIDE);
         #else
         CloseAllResource();
         #endif
      }



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 13.1.2010, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Dem_max @  12.1.2010,  16:54 Найти цитируемый пост)
Если основная программа имеет этот самый манифест XP то проблем таких нету.Но в качестве этой основной программы могут быть разные приложения в том числе и без манифеста XP.Тогда получается как на 2 рисунке.Есть пути решения данной проблемы

не надо так заморачиваться, DLL на то и нужна, чтобы "дополнять", а не "заменять"
если кому-то потребуется подгрузить GUI без манифеста, пусть грузит,

ты же не хочешь, чтобы от твоего GUI кто-либо отказался по причине того,
что он на фоне остальных компонентов выделяется "белой вороной"


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 13.1.2010, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну хорошо, раз "дополнять", как мне тогда отследить что при вызове моего плагина вызвавшая программа имеет манифест, чтобы изменить поведение интерфейса ? какой нить вариант без учета поиска этого манифеста в ресурсах EXE.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 13.1.2010, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



искать в ресурсах - не совсем корректно, т.к. манифест может лежать рядом,
можно пробовать Theme API, например: IsThemeActive или OpenThemeData

проверяй сам (XP под рукой не имею)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
  Дата 13.1.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



GremlinProg, 
Не эти функции не канают, что есть манифест EXE что нету, все равно функции выдают положительный результат активности и включенности темы. 
В голове возник один подлый вариант, к программе вызывающей DLL подкладывать манифест отдельным файлом.   smile 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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