![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
586, спасибо, что растолковал ))
--------------------
Experimentia est optima rerum magistra |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Кстати, в винде есть такая прога - rundll32. Она запускает процедуры в библиотеках.
rundll32.exe shell32.dll,ShellAboutA Таким образом можно запустить DLL, "без приложения". Может пригодится... |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Теперь еще смешнее. При первой загрузке-выгрузке модуля все функции импортируются и выполняются нормально. Но при повторной загрузке выполняются все функции кроме ModuleWinMain. Проскакивает и окошек не делается.
Вот такая проблема. И еще: если загрузить модуль, а потом его копию (то есть имя файла другое, а контент тот же), то вылазит ошибка 0хС000000000000005 Вот никогда бы не подумал, что будут такие проблемы... --------------------
Experimentia est optima rerum magistra |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Переходи на DLL!!!!!!!!! У exe проблемы с импортом! Для этого изобрели DLL. Вообще, зачем тебе функция WinMain? Хендл модуля ты знаешь, как и без него получить. |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Что ты этим сказать хотел? Я и так гружу длл. просто в нем есть WinMain. 586, WinMain мне для того, чтобы окно в длл было (впринципе функцию хоть как назвать можно - от этого ниче не меняется). Поясню свою задачу: Мне необходимо из ехе загружать много разных длл, в которых свои маленькие программки. Нужно, чтобы нельзя ![]() Эти длл содержат и экспортируемые функции и свои окошки - если мелко сказать. А если нормально, то это целые проекты (в будущем, разумеется). Почему я не сделаю все наооборот? Почему в эти проекты не засуну длл моего ехе? Потому что я хочу, чтобы из одного моего ехе были доступны все эти проекты. Потому что так удобно и целостно. Но вот эта проблема с импортом... Нехочет второй раз импортировать мой ехе функцию WinMain модуля. Я ее уже и по другому называл, но ничего. Может еще процедуру обозвать по другому. Я в WinAPI недвано начал писать и с этими процедурами и функциями неполностью разобрался. 586, попробуй из ехе вызвать функцию WinMain (обзови ее по-другому) так, чтобы окно (ну или диалог), которое у тебя в длл, появилось. Потом выгрузи. И повтори операцию. Загрузится опять или нет? И если да, то скинь, плиз, пример длл и ехе. PS и почему никто больше постов не пишет? --------------------
Experimentia est optima rerum magistra |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
В принципе понял, в чем суть, и могу порекомендовать экспортировать не WinMain функции, а наборы оконных классов, каждый класс будет описывать твой отдельный модуль, а из exe проекта нужно будет только подгружать твою библиотеку и создавать окно экспортированного класса. За примером долго ходить не надо, сама винда использует этот способ (32-битные версии). Если необходимо несколько окон, создавай несколько, но это уже в процедуре окна. Это еще удобно тем, что проблем с синхронизацией у тебя не будет. Посмотри, например, как реализована библиотека comctl32, которую использует большинство виндовых программ, посмотри, сколько она содержит классов, а каждый класс - это и есть отдельная подпрограмма - как раз то о чем ты и спрашивал.
Но в сущности, библиотеки используются не для такой поддержки, как "приложение-провайдер", а просто для того, чтобы уменьшить объем кода в программах, уменьшить время её загрузки и уменьшить общее, потребляемое количество ресурсов в системе. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 4 Всего: 29 |
Так может быть проще запускать дополнительные потоки, в которых и будут работать "маленькие программки" ![]() Это сообщение отредактировал(а) Damarus - 20.7.2006, 20:36 |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Damarus, всмысле Thread? Я еще не очень курю. Как я понял можно экспортить win main модуля, а потом создать для нее поток. Если я правильно понял, спасибо!
Это сообщение отредактировал(а) MoZy - 20.7.2006, 20:49 --------------------
Experimentia est optima rerum magistra |
|||
|
||||
Damarus |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 4 Всего: 29 |
Принцип следующий:
Dll'ка с первой программой (MoZyDll1.dll):
Dll'ка со второй программой (MoZyDll2.dll):
Exe, загружающий Dll'ки:
|
||||||
|
|||||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Sleep(INFINITE) - весьма оригинально!
библиотеки так не выгрузятся, нужно использовать WaitForMultipleObjects для обоих потоков, так что нужно, чтобы RunProgram из длл возвращали хотя бы дескрипторы потоков. Добавлено @ 21:51 но в любом случае нужно придумать еще и защиту: такую библиотеку подгрузит любая программа и вызовет RunProgram, имя будет известно, а в данном случае - и параметры тоже. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Damarus |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 4 Всего: 29 |
GremlinProg, всё верно, но это просто пример ![]() Добавлено @ 22:59
Тоже верно, но полная защита не возможна. Это сообщение отредактировал(а) Damarus - 20.7.2006, 21:59 |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Damarus, Sleep(INFINITE), WaitForMultipleObjects и т.п. - методы для синхронизации объектов, я как раз про них и говорил. Отлаживать такие приложения(в винде) довольно сложно, потому что они разделены во времени, поэтому и предложил более простой способ. Нужно хорошо знать принципы построения "параллельных" программ, чтобы писать корректный код. Не каждый может таким умением похвастаться.
С защитой, конечно, согласен, но если так думать, то можно вообще не защищать софт. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Всем спасибо. Но потоки никак не изменили результат. Разве что их стало больше. Меня впринципе любой вариант устраивает. И импорт WinMain'a, и импорт функции, вызывающей WinMain, и создание потока с импортируемой функцией WinMain, и создание потока с импортируемой функцией, вызывающей WinMain, и импорт функции, создающей поток с WinMain.
Но все это не работает так как надо! Почему-то при любой из этих махинаций WinMain второй раз не вызывается ![]() Извинияюся ![]() Оказалось функция вылетает при регистрации класса ![]() Ну вот. Как говорится: "Один дурак задаст столько вопросов, что сто мудрецов не ответят." Думаю тему надо закрыть. Но спешить не буду ![]()
Я уже реализовал протокол между хостом и плагинами, так что незная его плагином не воспользоваться ![]() Один OFF TOPIC: новички могут поднимать репутацию? ![]() Это сообщение отредактировал(а) MoZy - 21.7.2006, 18:06 --------------------
Experimentia est optima rerum magistra |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |