35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
1

Как передать HWND параметром через ShellExecute?

03.12.2015, 22:28. Показов 1738. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.

Как передать HWND параметром через ShellExexute?

Передаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        HANDLE updater_hwnd = hwnd;
        std::ostringstream os_updater_hwnd;
        os_updater_hwnd << updater_hwnd;
        std::string s_updater_hwnd = os_updater_hwnd.str();
 
        std::wstring w_updater_hwnd = s2ws(s_updater_hwnd);
        std::wstring w_version = s2ws(_version);
 
        std::wstring parameters = w_version + L" " + w_updater_hwnd
 
        SHELLEXECUTEINFO ShExecInfo = { 0 };
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = NULL;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = L"open";
        ShExecInfo.lpFile = L"program.exe";
        ShExecInfo.lpParameters = w_version.c_str();
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_SHOWNORMAL; //SW_HIDE
        ShExecInfo.hInstApp = NULL;
 
        ShellExecuteEx(&ShExecInfo);
Принимаю так:
C++
1
HWND updater_hwnd = (HWND)argv[2];
Что-то не так. Что именно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2015, 22:28
Ответы с готовыми решениями:

Как передать параметры через ShellExecute - C++
Приветствую Как передать строку и число через ShellExecute? SHELLEXECUTEINFO ShExecInfo = { 0 };...

Как передать в ShellExecute 2 аргумента в кавычках?
Пытаюсь подставить кавычки, чтобы аргументы, в значении которых есть пробелы воспринимались единым...

Как в ShellExecute передать несколько параметров?
Допустим такой вызов ShellExecuteA(NULL, &quot;open&quot;, &quot;cmd.exe&quot;, &quot;/C ipconfig&quot; , NULL, SW_SHOW); А как...

ShellExecute с параметром
Как сделать поддержку программой комманд??? Тоесть запуск не C:fdisk.exe, а C:fdisk.exe /all ???

36
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
03.12.2015, 23:10 2
C++
1
std::wstring parameters = w_version + L" " + to_wstring(hwnd);
C++
1
sscanf(argv[2], "%p", &updater_hwnd);
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 23:28  [ТС] 3
nmcf, HANDLE и HWND не подходит для to_wstring()
Попробовал это
C++
1
sscanf_s(argv[2], "%p", &updater_hwnd);
Не помогло

Добавлено через 4 минуты
nmcf, может проблема в другом. В общем суть в том, чтобы отправить этому окну сообщение.
Т.е. я принимаю hwnd и отправляю сообщение так:
C++
1
2
3
4
5
    HWND updater_hwnd;
    sscanf_s(argv[2], "%p", &updater_hwnd);
    MessageBoxA(0, "", argv[2], NULL);
    std::string response = "okey";
    SendMessage(updater_hwnd, WM_COPYDATA, (WPARAM)response.c_str(), 0);
Проверил, передается и принимается одно и тоже значение hwnd.
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
03.12.2015, 23:32 4
C++
1
2
3
std::wostringstream os_updater_hwnd;
os_updater_hwnd << hwnd;
std::wstring parameters = w_version + L" " + os_updater_hwnd.str();
Извлекать, как показал.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 23:38  [ТС] 5
nmcf, так лучше, спасибо. Но сути это не изменило, проблема та же

Добавлено через 33 секунды
Вот здесь должно быть получено сообщение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    ViewWin* view = ViewWin::GetFromHandle(hWnd);
 
    switch (message) {
    case WM_COPYDATA:
        MessageBoxW(0, (LPWSTR)wParam, (LPWSTR)wParam, NULL);
    case WM_COMMAND:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    case WM_TIMER:
        break;
    case WM_SIZE:
        if (view) {
            view->web_view()->Resize(LOWORD(lParam), HIWORD(lParam));
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_QUIT:
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
03.12.2015, 23:39 6
Какая проблема-то? HWND - указатель. Ты видишь его шестнадцатеричное значение в строке, т. е. он передаётся в программу через ShellExecute?
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
03.12.2015, 23:42  [ТС] 7
nmcf, я sscanf заменил на sscanf_s, т.к. мой компилятор ругается что функция sscanf не надежная.

Добавлено через 49 секунд
nmcf, да, передается. И принимается то значение, которое я вижу в дебагере у переменной os_updater_hwnd.

Добавлено через 1 минуту
nmcf, проблема в том что не приходит окну сообщение WM_COPYDATA
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
03.12.2015, 23:47 8
Во-первых, ты не правильно передаёшь это сообщение: https://msdn.microsoft.com/en-... 85%29.aspx
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
04.12.2015, 10:47  [ТС] 9
nmcf, cделал так:
C++
1
2
3
4
5
6
7
8
9
10
        std::string response = "okey";
        char char_response[5];
        strcpy_s(char_response, response.c_str());
        
        COPYDATASTRUCT Send_Data;
        Send_Data.dwData = 1;
        Send_Data.cbData = 5;
        Send_Data.lpData = char_response;
 
        SendMessage(updater_hwnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&Send_Data);
Не помогло.

Добавлено через 1 час 9 минут
Получил hwnd окна таким образом:
C++
1
HWND updater_hwnd2 = FindWindow(0, L"updater");
Тогда сообщение программа получает, но lParam содержит текст "Ошибка", wParam содержит символ квадратик.

Получается 2 недочета в программе.
1. Не правильная переменная updater_hwnd.
2. Не правильно передаются данные.

Помогите)

Добавлено через 15 минут
Всё работает если получать так:
C++
1
2
3
4
5
6
    case WM_COPYDATA:
        PCOPYDATASTRUCT Get_Data;
        Get_Data = (PCOPYDATASTRUCT)lParam;
        response = (char*)Get_Data->lpData;
        MessageBoxW(0, (LPWSTR)lParam, convertCharArrayToLPCWSTR(response), NULL);
        break;
Решено
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
04.12.2015, 12:56 10
Лучший ответ Сообщение было отмечено Randen как решение

Решение

Проверил у себя. Всё передаётся:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    SHELLEXECUTEINFO ShExecInfo;
    TCHAR s[10];
    COPYDATASTRUCT *pcd;
 
//...
    case WM_COPYDATA:
        pcd = (COPYDATASTRUCT *)lParam;
        if (pcd->dwData == 1)
        {
            wcscpy(recv_data, (TCHAR *)pcd->lpData); // копирование в глобальную переменную
        }
        break;
 
//...
 
        case ID_32771:
 
            swprintf(s, L"%p", hWnd);
 
            ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
            ShExecInfo.fMask = SEE_MASK_DEFAULT;
            ShExecInfo.hwnd = hWnd;
            ShExecInfo.lpVerb = L"open";
            ShExecInfo.lpFile = L"program.exe";
            ShExecInfo.lpParameters = s;
            ShExecInfo.lpDirectory = NULL;
            ShExecInfo.nShow = SW_SHOWMINIMIZED;
 
            if (!ShellExecuteEx(&ShExecInfo)) MessageBox(hWnd, L"ShellExecuteEx error.", L"Error", MB_OK);
 
            break;
Отправка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        TCHAR s[10];
    HWND hwnd_recv;
    COPYDATASTRUCT cd;
 
//...
 
        case ID_32771:
            if (swscanf(CmdLine, L"%p", &hwnd_recv) == 1)
            {
                TCHAR m[] = L"Message";
                cd.dwData = 1;
                cd.lpData = m;
                cd.cbData = sizeof(m);
                SendMessage(hwnd_recv, WM_COPYDATA, (LPARAM)hWnd, (WPARAM)&cd);
            }
            break;
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
05.12.2015, 13:34  [ТС] 11
nmcf, я так и не разобрался вот с чем.
Не могу правильно передать и принять HWND.
С помощью
C++
1
HWND updater_hwnd2 = FindWindow(0, L"updater");
Всё работает. Но через параметры ShellExecute не получается дальше работа.
Помогите)

Добавлено через 21 минуту
nmcf, надо было передавать так:
C++
1
swprintf(s, L"%p", hWnd);
Спасибо!
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
05.12.2015, 13:43 12
Можно и через string сделать, главное одинаково чтобы было с обеих сторон.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
05.12.2015, 14:56  [ТС] 13
nmcf, а еще подскажите, как создать TCHAR динамически?
Вот я делаю так:
C++
1
2
3
int len = parameters.length();
        TCHAR *s = new TCHAR(len);
        swprintf_s(s, L"%p", parameters);
swprintf_s ругается
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
05.12.2015, 14:59 14
Скобки квадратные сделай.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
05.12.2015, 15:54  [ТС] 15
nmcf, куда только я не поставил квадратные скобки) Не понимаю

Добавлено через 47 минут
Не получается(
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
05.12.2015, 15:56 16
C++
1
TCHAR *s = new TCHAR[len];
Может, len + 1? Parameters - это что?
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
05.12.2015, 15:58  [ТС] 17
nmcf, Parameters это string
C++
1
2
3
4
        std::string parameters = os_updater_hwnd.str();
        int len = parameters.length();
        char *s = new char[len];
        sprintf_s(s, "%p", parameters);
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
05.12.2015, 16:18 18
Тогда +1. Проще описать простой массив без динамического выделения. 10 символов хватит под HWND.
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
05.12.2015, 17:34  [ТС] 19
nmcf, просто параметров будет больше чем HWND. +1 не помогает
C++
1
2
3
4
std::string parameters = os_updater_hwnd.str();
        int len = parameters.length()+1;
        char *s = new char[len];
        sprintf_s(s, "%p", parameters);
0
7528 / 6393 / 2914
Регистрация: 14.04.2014
Сообщений: 27,852
05.12.2015, 17:45 20
Даже если их больше, можно хоть на килобайт массив описать.

Я не пойму смысл твоего фрагмента. HWND - указатель. Если ты хочешь преобразовать его средствами ostringstream, то тебе не нужен sprintf(), а если хочешь sprintf(), то незачем предварительно преобразовывать в string.
C++
1
sprintf_s(s, "%p", hWnd);
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2015, 17:45
Помогаю со студенческими работами здесь

Как осуществить через WinExec или ShellExecute копирование файла через cmd?
Народ как осуществить через WinExec или ShellExecute копирование файла через cmd??? в консоли...

Как передать параметром FlexGrid ?
Подскажите пожалуйста. У меня 2 таблицы FlexGrid. Для них выполняется одна и та же функция. Где...

Как передать программе на паскале параметром...
Приветствую! Недавно впервые столкнулся с проблемой передачи данных в паскалевскую прогу...

Как в процедуру передать параметром AdoQuery?
На datamodule расположен ADOQuery. Собственно в коде обращаюсь так DM.ADOQuery. ... Чтобы не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru