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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать hInstance приложения? 
:(
    Опции темы
regis
Дата 11.7.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



Subj -- можно как-нибудь это сделать (если входной точкой программы является не WinMain)?
Есть какой-нибудь API для этого или нет?

 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
_hunter
Дата 11.7.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а для чего но тебе нужно?

P.S.
API для нету потому как это работа загрузчика 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
regis
Дата 11.7.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



Знать hInstance требуется для множества функций --  RegisterClass, например.

А проблема в том, что я разрабатываю программу на MinGW. Стандартная точка входа -- не WinMain, а обычная main (argc, argv). То есть, видимо, где-то в стандартных библиотеках все-равно вызывается WinMain -- но вот как оттуда извлечь параметр hInstance, не представляю...
 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
_hunter
Дата 11.7.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



так ты консольное приложение собираеш (потому и простой main)
там, по-идее, какой-то ключ должен быть... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
586
Дата 11.7.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



GetModuleHandle(0); 
PM   Вверх
Wolf
Дата 11.7.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

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



586 прав, всё простенько очень определяется hInst=GetModuleHandle(NULL); 
PM MAIL ICQ   Вверх
regis
Дата 13.7.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



586 и Wolf, огромное спасибо! Это именно то, что было надо.

По поводу приложения: да, оно у меня консольное -- но вместе с тем, иногда возникает необходимость работать с окнами. Желательно как-то совместить консольный и оконный интерфейсы. В связи с этим плавно переходим к следующему вопросу -- как это лучше сделать.  smile 

Поясню вопрос. Пока что все работает примерно так: нормальный режим -- консольный, но в определенные моменты входим в "оконный режим": открываем одно (2, 3, N...) окошек и запускаем традиционный цикл обработки сообщений (while (GetMessage (...) { TranslateMessage (...); DispatchMessage (...); })) Когда закрывается последнее окно, покидаем цикл и возвращаемся в консольный режим. Все работает, но хотелось бы сделать как-нибудь поизящнее, что ли... Если будут какие-нибудь идеи, буду благодарен.

 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Exekutor
Дата 13.7.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

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



Просто создавай окна из консоли с помощью CreateWindowExA 


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
586
Дата 13.7.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
#include <windows.h>
#include <stdio.h>

char* GetErrDscr()
{
    char *p;
    FormatMessage(0x1100, 0, GetLastError(), 0, (char*)&p, 0, 0);
    return p;
}

int _stdcall MainWndProc(HWND, UINT, WPARAM, long);
long pMainWndProc;

int width=640, height=480;
HWND hMainWnd;
HINSTANCE hinst;

int __cdecl main(int argc, char** argv)
{
 MSG msg;
 hinst=GetModuleHandle(0);
 hMainWnd=CreateWindowEx(0, (char*)32770, "Test application", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SIZEBOX, 
     (GetSystemMetrics(SM_CXSCREEN)-width)/2, (GetSystemMetrics(SM_CYSCREEN)-height)/2, width, height, 0, 0, hinst, 0);
 if(!hMainWnd){MessageBoxA(0, GetErrDscr(), "Failed to create main window", 16); return 1;}
 pMainWndProc=SetWindowLong(hMainWnd, GWL_WNDPROC, (long)MainWndProc);

 while(IsWindow(hMainWnd))
 {
    if(!GetMessage(&msg, hMainWnd, 0, 0)) break;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }
 return 0;
}

int _stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
 switch(uMsg)
 {
    case WM_CLOSE: DefWindowProc(hWnd, WM_CLOSE, 0, 0); break;
 }
 return CallWindowProc((WNDPROC)pMainWndProc, hWnd, uMsg, wParam, lParam);
}
 
Если окно диалоговое - юзай DialogBoxParam или CreateDialogParam

Это сообщение отредактировал(а) 586 - 13.7.2006, 12:48
PM   Вверх
regis
Дата 20.7.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

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



586, спасибо. Идея насчет использования IsWindow неплохая...
 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
GremlinProg
Дата 20.7.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



только не используй GetModuleHandle(NULL) в DLL, она вернет дескриптор программного модуля, а не самой библиотеки. 


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

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



В длл пользуйтесь HINSTANCE GetCurrentInstance()
Код

inline HINSTANCE __stdcall GetInstanceFromAddress(PVOID pEip) { // возвращает HINSTANCE модуля, из которого была вызвана эта функция (© Alex Fedotov rsdn)
   _ASSERTE(pEip != NULL);

   MEMORY_BASIC_INFORMATION mem;
   if (VirtualQuery(pEip, &mem, sizeof(mem)))
   {
      _ASSERTE((mem.Type == MEM_IMAGE) || (mem.Type == MEM_PRIVATE));
      _ASSERTE(mem.AllocationBase != NULL);
      return (HINSTANCE)mem.AllocationBase;
   }
   return NULL;
}

inline __declspec(naked) HINSTANCE __stdcall GetCurrentInstance() // возвращает HINSTANCE модуля, из которого была вызвана эта функция (© Alex Fedotov rsdn)
{
   /** / // VC 7.0 поддерживат intrinsic-функцию с именем _ReturnAddress, которая возвращает адрес возврата из текущей функции.
         // С ее помощью можно обойтись и без ассемблера.
         // Но самое интересное в том, что на VC 6.0 она тоже поддерживается (уж не знаю, начиная с какого SP),
         // так что вот этот код без проблем компилируется и работает на моем VC 6.0 SP5
   MEMORY_BASIC_INFORMATION mem;
   if (VirtualQuery(_ReturnAddress(), &mem, sizeof(mem))) {
      _ASSERTE((mem.Type == MEM_IMAGE) || (mem.Type == MEM_PRIVATE));
      _ASSERTE(mem.AllocationBase != NULL);
      return (HINSTANCE)mem.AllocationBase;
   }
   return NULL;
   /**/
   __asm {
#ifdef _M_IX86
      mov   eax, [esp]
      push  eax
      jmp   GetInstanceFromAddress
#else
      #error This machine type is not supported.
#endif
   }
}



самому ещё не довелось проверить... 
PM MAIL   Вверх
GremlinProg
Дата 20.7.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



я пробовал VirtualQuery в DLL, mem.AllocationBase вернет все тот же программный модуль, а не DLL. Ассемблер можно даже не использовать, просто указать адрес любого локального метода.

Чтобы получить реальный дескриптор нужно пройтись по всем модулям текущего процесса(используя EnumProcessModules из апешки Psapi), затем получить их стартовые точки(EntryPoint) и сравнить их с DllMain для текущей библиотеки. чтобы получить EntryPoint нужно вызвать GetModuleInformation.

Мороки много а толку мало, поэтому проще обработать hinstDLL в DllMain и сохранить глобально, это не так уж и накладно. 


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


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(SeregaLBN @  20.7.2006,  18:09 Найти цитируемый пост)
В длл пользуйтесь HINSTANCE GetCurrentInstance()


За чем smile В длл пользуйтесь GetModuleHandle(TEXT("name.dll"));. 
PM MAIL ICQ Jabber   Вверх
GremlinProg
Дата 21.7.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

В длл пользуйтесь GetModuleHandle(TEXT("name.dll"));

Тогда для каждой длл нужно отдельно писать такую вещь, или заводить макрос с именем длл, т.е. для методов, использующих hInstance в длл придется писать отдельный от exe код. Муторно. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0948 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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