Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Как узнать hInstance приложения? |
Автор: regis 11.7.2006, 11:49 |
Subj -- можно как-нибудь это сделать (если входной точкой программы является не WinMain)? Есть какой-нибудь API для этого или нет? |
Автор: _hunter 11.7.2006, 12:04 |
а для чего но тебе нужно? P.S. API для нету потому как это работа загрузчика |
Автор: regis 11.7.2006, 13:00 |
Знать hInstance требуется для множества функций -- RegisterClass, например. А проблема в том, что я разрабатываю программу на MinGW. Стандартная точка входа -- не WinMain, а обычная main (argc, argv). То есть, видимо, где-то в стандартных библиотеках все-равно вызывается WinMain -- но вот как оттуда извлечь параметр hInstance, не представляю... |
Автор: _hunter 11.7.2006, 13:26 |
так ты консольное приложение собираеш (потому и простой main) там, по-идее, какой-то ключ должен быть... |
Автор: 586 11.7.2006, 13:31 |
GetModuleHandle(0); |
Автор: Wolf 11.7.2006, 15:02 |
586 прав, всё простенько очень определяется hInst=GetModuleHandle(NULL); |
Автор: regis 13.7.2006, 11:00 |
586 и Wolf, огромное спасибо! Это именно то, что было надо. По поводу приложения: да, оно у меня консольное -- но вместе с тем, иногда возникает необходимость работать с окнами. Желательно как-то совместить консольный и оконный интерфейсы. В связи с этим плавно переходим к следующему вопросу -- как это лучше сделать. ![]() Поясню вопрос. Пока что все работает примерно так: нормальный режим -- консольный, но в определенные моменты входим в "оконный режим": открываем одно (2, 3, N...) окошек и запускаем традиционный цикл обработки сообщений (while (GetMessage (...) { TranslateMessage (...); DispatchMessage (...); })) Когда закрывается последнее окно, покидаем цикл и возвращаемся в консольный режим. Все работает, но хотелось бы сделать как-нибудь поизящнее, что ли... Если будут какие-нибудь идеи, буду благодарен. |
Автор: Exekutor 13.7.2006, 12:33 |
Просто создавай окна из консоли с помощью CreateWindowExA |
Автор: 586 13.7.2006, 12:45 | ||
Если окно диалоговое - юзай DialogBoxParam или CreateDialogParam. |
Автор: regis 20.7.2006, 11:34 |
586, спасибо. Идея насчет использования IsWindow неплохая... |
Автор: GremlinProg 20.7.2006, 12:54 |
только не используй GetModuleHandle(NULL) в DLL, она вернет дескриптор программного модуля, а не самой библиотеки. |
Автор: SeregaLBN 20.7.2006, 17:09 | ||
В длл пользуйтесь HINSTANCE GetCurrentInstance()
самому ещё не довелось проверить... |
Автор: GremlinProg 20.7.2006, 17:28 |
я пробовал VirtualQuery в DLL, mem.AllocationBase вернет все тот же программный модуль, а не DLL. Ассемблер можно даже не использовать, просто указать адрес любого локального метода. Чтобы получить реальный дескриптор нужно пройтись по всем модулям текущего процесса(используя EnumProcessModules из апешки Psapi), затем получить их стартовые точки(EntryPoint) и сравнить их с DllMain для текущей библиотеки. чтобы получить EntryPoint нужно вызвать GetModuleInformation. Мороки много а толку мало, поэтому проще обработать hinstDLL в DllMain и сохранить глобально, это не так уж и накладно. |
Автор: Damarus 21.7.2006, 08:54 |
За чем ![]() |
Автор: GremlinProg 21.7.2006, 09:06 | ||
Тогда для каждой длл нужно отдельно писать такую вещь, или заводить макрос с именем длл, т.е. для методов, использующих hInstance в длл придется писать отдельный от exe код. Муторно. |
Автор: 586 21.7.2006, 10:43 |
Damarus, а что, если модуль с таким именем уже загружен. База какого модуля будет получена? |
Автор: Damarus 21.7.2006, 12:19 |
586, да, об этом я не подумал. |