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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие окна из dll 
V
    Опции темы
DissDoc
Дата 17.12.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Всем привет. Есть какая-то очень сложная программа. С помощью модулей (dll) к ней можно писать свои дополнения.
Так вот. У меня дополнения довольно объемные, с созданием окон.
Вопрос вот в чем. В спецификации к программе четко написано, что нельзя изпользовать выход из окна своего модуля с помощью PostQuitMessage(0). :( Программа валится. Проверял - действительно.
Все делаю через WinAPI. Как можно иначе закрыть окно?
PM MAIL WWW   Вверх
borisbn
Дата 17.12.2010, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SendMessage WM_CLOSE ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
DissDoc
Дата 17.12.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



ХМ... Поведение точно такое же, как с помощью DestroyWindow
А именно, окно закрывается, а управление не передается... Сейчас копаю в сторону обработки ::GetMessage и отправки флагов TRUE или FALSE..
Ничего пока не выходит(
PM MAIL WWW   Вверх
GremlinProg
Дата 17.12.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DissDoc @  17.12.2010,  13:39 Найти цитируемый пост)
ХМ... Поведение точно такое же, как с помощью DestroyWindow

так и есть, в ответ на WM_CLOSE DefWindowProc вызывает DestroyWindow
Цитата(DissDoc @  17.12.2010,  13:39 Найти цитируемый пост)
а управление не передается... 

как это понимать?
Цитата(DissDoc @  17.12.2010,  02:21 Найти цитируемый пост)
Как можно иначе закрыть окно?

у меня по этому поводу 2 встречных вопроса:
1. какого рода окно: обычное ( CreateWindow, CreateDialog ) или модальное ( DialogBoxxxx )?
2. создается ли оно в основном потоке?


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



1. Обычное. CreateWindow
2. Да, создается в основном потоке.
PM MAIL WWW   Вверх
GremlinProg
Дата 17.12.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GremlinProg @  17.12.2010,  13:54 Найти цитируемый пост)

Цитата(DissDoc @  17.12.2010,  13:39 Найти цитируемый пост)
а управление не передается... 

как это понимать?

?
Цитата(DissDoc @  17.12.2010,  14:00 Найти цитируемый пост)

1. Обычное. CreateWindow
2. Да, создается в основном потоке.

может стоит попробовать модальный диалог?

трансляция сообщений для обычного окна производит само приложение,
так что здесь оно устанавливает правила,
а модальный диалог имеет свой цикл обработки сообщений, т.е. независим ни от кого

ps: если ошибка останется с модальным диалогом, значит дело не в окнах


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Управление не передается - программа, из под которой запускается моя dll остается "залипшей"
Попробую с модальный диалогом.
PM MAIL WWW   Вверх
DissDoc
Дата 17.12.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Что я делаю не так? У меня не появляется диалог
Код

HINSTANCE hinstance = GetModuleHandle(NULL);
DialogBox(hinstance, MAKEINTRESOURCE(IDD_TEST_DLG), NULL, reinterpret_cast<DLGPROC>(TestDlgProc));

И сама функция обработки
Код

LRESULT CALLBACK TestDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{
    switch(msg)
    {
    case WM_INITDIALOG:        
        return TRUE;
    case WM_COMMAND:
        switch(wparam)
        {
        case IDOK:
            EndDialog(hwnd, 0);
            return TRUE;
        }
        break;
    return FALSE;
    }
}

В самом диалоге выставил Visible в TRUE

Это сообщение отредактировал(а) DissDoc - 17.12.2010, 14:12
PM MAIL WWW   Вверх
GremlinProg
Дата 17.12.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DissDoc @  17.12.2010,  16:11 Найти цитируемый пост)
HINSTANCE hinstance = GetModuleHandle(NULL);

это HINSTANCE приложения, а не длл, в которой расположен ресурс диалога,
HINSTANCE длл приходит в DllMain


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



GremlinProg, не совсем понятно.. Т.е. нужно вот так?
Код

HWND hWnd = FindWindow(NULL,"SOMEWINDOW");
if (hWnd == NULL) return;
HINSTANCE hinstance = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);

В этом случае GWL_HINSTANCE - undeclare indefined :(

Это сообщение отредактировал(а) DissDoc - 17.12.2010, 14:29
PM MAIL WWW   Вверх
GremlinProg
Дата 17.12.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



нет, нужно в DialogBox передать HINSTANCE того модуля, в котором лежит ресурс IDD_TEST_DLG,

а раз IDD_TEST_DLG у тебя лежит в твоей же библиотеке (я так понимаю), то GetModuleHandle( NULL ) для него не подходит,
подходит HINSTANCE, которая приходит в DllMain первым параметром


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Вот тут еще одна проблема... структура dll такова, что не передает HINSTANCE.... Я вообще сейчас думаю перебрать все окна открытые и взять с определенным именем окно :(
Просто иначе не вижу смысла.
PM MAIL WWW   Вверх
GremlinProg
Дата 17.12.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



как не передает-то?
http://msdn.microsoft.com/en-us/library/ms...6(v=vs.85).aspx
смотри по аналогии:
Код


HINSTANCE hInstance; //глобальная переменная!

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
            hInstance = hinstDLL;
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

поправки к TestDlgProc:
Цитата

INT_PTR CALLBACK TestDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{
    switch(msg)
    {
    case WM_INITDIALOG:        
        return TRUE;
    case WM_COMMAND:
        switch(wparam)
        {
        case IDOK:
            EndDialog(hwnd, 0);
            return TRUE;
        }
        break;
    }
    return FALSE;
}


где-то в функции расширения, где у тебя необходимо показать окно:
Код

...
DialogBox( hinstance, MAKEINTRESOURCE( IDD_TEST_DLG ), NULL, TestDlgProc );
...




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


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Да, если бы было все так просто smile
У меня  есть одна функция только (которая дается для написания своих дополнений)
Т.е. dll создаю с помощью void set_module(int param)
И все.
Или я чего-то не догоняю... =\
PM MAIL WWW   Вверх
xvr
Дата 19.12.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(DissDoc @  17.12.2010,  15:49 Найти цитируемый пост)
Т.е. dll создаю с помощью void set_module(int param)
Обычно dll создаются компилятором. И никакой set_module тут не при чем. 
У вас ТЕСКТ вашей dll в наличие имеется? Вот в нем и ищите функцию DllMain


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.4621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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