Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
1

Пересылка сообщений

17.03.2010, 11:25. Просмотров 1487. Ответов 12
Метки нет (Все метки)

необходимо что б дочерний процесс переслал сообщение радителю

я написал следующее

это дочерний процесс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
#include <windows.h>
 
int main(){
MSG msg;
HWND hwnd=FindWindow(NULL,L"BRTWND");
if(!hwnd)cerr<<"error";
msg.message=111111;
 
if(!PostMessage(hwnd,111111,0,0))cerr<<"Error posting message";
 
char a;
cin>>a;
};

это родитель
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
#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
 
int main(int argc,char** argv)
{
char*p=argv[0];
while(*p)p++;
while(*p!='\\')p--;
int i=p-argv[0]+10;
char *adr = new char[i];
char *d=(adr+i-10);
strcpy(d+1,"test4.exe");
while(d>=adr){*d=*p;d--;p--;}
wchar_t *strok=new wchar_t[i+1];
MultiByteToWideChar(CP_ACP,0,adr,i,strok,i);
strok[i]=0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
if(!CreateProcess(strok,0,0,0,0,CREATE_NEW_CONSOLE,0,0,&si,&pi))cerr<<"Error Creatig Process";
MSG msg;
GetMessage(&msg,NULL,0,100);
int a,b;
a+=b;
cout<<msg.hwnd;
return 0;
}
несмотря на то что по ходу обоих процессов ошибки не выкидываются родительский процесс зависает на GetMessage();

помогите мне пожалуйста

не может найти процесс
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2010, 11:25
Ответы с готовыми решениями:

Пересылка проекта VC++ (какие файлы действительно нужны?)
Папка с несложным проектом VC+ может весить до сотни сотен мегабайт. Если надо послать проект по...

Пересылка сообщений
Здравствуйте.Еще только начинаю разбираться,вот такой вопрос: Стоит задача из клиентской локальной...

Пересылка сообщений по сети
Доброй всем ночи. Я пишу на C# не так давно, и захотел написать приложение которое работало бы...

Пересылка сообщений между клиентами
есть сервер class ServeOneJabber extends Thread { private Socket socket; private...

12
199 / 186 / 26
Регистрация: 14.02.2010
Сообщений: 540
18.03.2010, 19:32 2
Блин, я, кажется, что-то в жизни важное упустил. Консоль управляется Windows-сообщениями?
0
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
19.03.2010, 06:57 3
Цитата Сообщение от kukuruku310 Посмотреть сообщение
Блин, я, кажется, что-то в жизни важное упустил. Консоль управляется Windows-сообщениями?
точно, упустил.
в Windows нет другой системы коммуникации между приложением и ОС, кроме Windows-сообщений.

breate, у окна консоли есть свой диспетчер сообщений, так что твое сообщение - скорее всего, просто не успевает считаться.
А может, просто ты попал в область уже зарегистрированных сообщений.
И диспетчер считав 111111 что-то там делает.

В любом случае, правильно было бы просматривать очередь сообщений ДО диспетчера консоли.
Для этого в основной программе нужно подменить главную функцию окна и ловить сообщения там.
0
199 / 186 / 26
Регистрация: 14.02.2010
Сообщений: 540
19.03.2010, 12:04 4
Так я и говорю, что упустил... Хотя... Ведь если перекрывать главную функцию окна (консоли) - будет ли это все еще консоль?.
Но в любом случае, интересно было такое увидеть. Я просто консоль в своей практике НИКОГДА не использовал. Но - век живи, два века учись...
0
1256 / 794 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
19.03.2010, 13:01 5
Я просто консоль в своей практике НИКОГДА не использовал. Но - век живи, два века учись...
Консоль бывает порой удобней GUI, консоль даже перетаскивание файлов поддерживает это я так
к сведению даже сообщение для это обрабатывать не надо.
0
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
19.03.2010, 13:02 6
Цитата Сообщение от kukuruku310 Посмотреть сообщение
Ведь если перекрывать главную функцию окна (консоли) - будет ли это все еще консоль?.
не перекрывать.
обычный subclass.
сначала работает своя "самодельная" функция, а потом управление передается в стандартную консольную.
Цитата Сообщение от kukuruku310 Посмотреть сообщение
Я просто консоль в своей практике НИКОГДА не использовал.
да я практически тоже.
единственно, студентам задачки писал на заказ.
консоль - это такое же окно, как и любое другое.
и работать с ним можно практически так-же, как и с обычным элементом диалога "EditBox".
1
1256 / 794 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
19.03.2010, 13:04 7
Я бы про консоль не забывал,
Мне даже не охотно писать диалог что бы зарегистрировать какой-нибудь dll сервер,
консоль для этого дела самое то, и сама закрывается после выполнения задачи.
0
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
19.03.2010, 13:07  [ТС] 8
я переписал эту штуку зарегистрировав сообщение и передавав хэндл родительского процесса

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
32
33
34
35
36
37
38
39
40
41
42
43
#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
 
int main(int argc,char** argv)
{
    int* envp=new int(10);
char*p=argv[0];
while(*p)p++;
while(*p!='\\')p--;
int i=p-argv[0]+10;
char *adr = new char[256];
char *d=(adr+i-10);
strcpy(d+1,"test4.exe");
char *eps=d+8;
while(*eps)eps++;
*eps=' ';eps++;
HANDLE handle;
handle = GetCurrentProcess();
int a=(int)&handle;
int b=0;
while(a){b=b*10+a%10;a/=10;}
while (b){*eps=b%10+48;eps++;b/=10;}
*eps=0;
i=eps-adr;
while(d>=adr){*d=*p;d--;p--;}
wchar_t *strok=new wchar_t[i+1];
MultiByteToWideChar(CP_ACP,0,adr,i,strok,i);
strok[i]=0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
UINT message=RegisterWindowMessage(L"HUI_WAM");
if(!PostMessage((HWND)handle,message,0,0)){cerr<<"Error posting message";cerr<<GetLastError();}
cout<<(int)&handle;
if(!CreateProcess(NULL,strok,0,0,1,CREATE_NEW_CONSOLE,0,0,&si,&pi))cerr<<"Error Creatig Process";
MSG msg;
GetMessage(&msg,NULL,0,100);
cout<<msg.hwnd;
return 0;
}

дочерний процесс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
#include <windows.h>
 
int main(int argc,char **argv){
for(int i=0;i<argc;i++)
    cout<<argv[i]<<endl;
int a=atoi(argv[1]);
    
    HANDLE handle=(HANDLE)a;
HWND hwnd=(HWND)&handle;
UINT message=RegisterWindowMessage(L"HUI_WAM");
if(!PostMessage(&hwnd,message,0,0)){cerr<<"Error posting message";cerr<<GetLastError();}
cin>>a;
 
};
я позже попробую создать ещё один поток в майне и его хэндл передать, кстати я так понял что HWND и HANDLE это практически одно и тоже на сколько я правильно понял и как коректнее их называть?
0
1256 / 794 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
19.03.2010, 13:24 9
HWND - это void * на сколько мне известно, наверное и HANDLE что то подобное.

Добавлено через 13 минут
Вот ещё информация может пригодиться:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Как получить дескриптор консольного окна (HWND):
 
 
Иногда необходимо производить какие-нибудь действия с окном, связанным с консольным приложением. Win32 API не предоставлят прямых методов получения дескриптора окна, связанного с консольным приложением. Однако, дескритор (handle) окна можно получить вызвав FindWindow(). Эта функция отыскивает дескриптор окна, основанный на имени класса либо имени окна.
 
Чтобы определить текущий заголовок консоли, вызывается GetConsoleTitle(). Затем этот заголовок указывается в функции FindWindow().
 
Так как несколько окошек могут иметь одинаковый заголовок, то Вам прийдётся изменить заголовок текущего консольного окна на уникальный. Это поможет защититься от получения неправильного дескриптора окна. Для изменения заголовка текущего консольного окна используется SetConsoleTitle(). Вот как это делается:
 
Вызываем GetConsoleTitle() чтобы сохранить заголовок текущего консольного окна.
 
 
Вызываем SetConsoleTitle() чтобы изменить заголовок на уникальный (неповторимы).
 
 
Вызываем Sleep(40) чтобы дать время заголовку измениться.
 
 
Вызываем FindWindow(NULL, uniquetitle), для получения HWND. Этот запрос возвратит HWND либо NULL в случае неудачи.
 
 
Вызываем SetConsoleTitle() со значением, полученным в шаге 1, для восстановления изначального заголовка окна.
 
 
Необходимо проверить полученный HWND. Например, можно проверить, соответствует ли полученный HWND текущего процесса, вызвав для него GetWindowText() с этим HWND и сравнив его с результатом, полученным при помощи GetConsoleTitle().
 
Нет гарантии, что полученный HWND подойдёт для всех возможных операций с дескриптором окна.
 
Пример кода
Следующая функция возвращает дескриптор текущего окна консольного приложения (HWND). Если функция выполнена удачно, то возвращённое значение будет являться дескриптором консольного окна, иначе, вслучае ошибки будет возвращён NULL. Для краткости, некоторые проверки возможных ошибок убраны.
 
   HWND GetConsoleHwnd(void)
   {
       #define MY_BUFSIZE 1024 // Размер буфера для заголовка консольного окна.
       HWND hwndFound;         // Это то, что будет возвращено.
       char pszNewWindowTitle[MY_BUFSIZE]; // Уникальный заголовок окна.
       char pszOldWindowTitle[MY_BUFSIZE]; // Изначальный заголовок окна.
 
       // Выбираем текущий заголовок окна.
 
       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
 
       // Формируем "уникальный" NewWindowTitle.
 
       wsprintf(pszNewWindowTitle,"%d/%d",
                   GetTickCount(),
                   GetCurrentProcessId());
 
       // Изменяем текущий заголовок окна.
 
       SetConsoleTitle(pszNewWindowTitle);
 
       // даём время заголовку, чтобы измениться.
 
       Sleep(40);
 
       // Ищем NewWindowTitle.
 
       hwndFound=FindWindow(NULL, pszNewWindowTitle);
 
       // Восстанавливаем изначальный заголовок окна.
 
       SetConsoleTitle(pszOldWindowTitle);
 
       return(hwndFound);
   }
1
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
19.03.2010, 13:27 10
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Я бы про консоль не забывал,
Мне даже не охотно писать диалог что бы зарегистрировать какой-нибудь dll сервер,
а я в таком случае пишу программу вообще без окна. даже консольного.
Цитата Сообщение от Genius Ignat Посмотреть сообщение
HWND - это void * на сколько мне известно, наверное и HANDLE что то подобное.
практически, HWND - частный случай HANDLE
HWND - это Handle WiNDow.
по типу HWND - это Unsigned int, а вовсе не *void
2
1256 / 794 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
19.03.2010, 13:41 11
Ладно приведу разъяснения по поводу сказано пусть не void *, я для себя подразумеваю:

Очень часто вами будет использоваться тип HANDLE - дескриптор, предназначенный для описания различных объектов. На самом деле этот тип представляет собой ни что иное, как указатель на void, т.е. как бы на любой тип.

Объекты Windows обычно представлены своими дескрипторами. Например, HWND - дескриптор окна. Что он из себя представляет? Давайте посмотрим:
В файле windef.h можно обнаружить такую строчку:

DECLARE_HANDLE (HWND);

Эта строка при определенной опции STRICT разворачивается в

struct HWND__ {int unused;};
typedef struct HWND__ *HWND

То есть HWND есть указатель на структуру HWND__. Если же опция STRICT не определена, то HWND везде заменяется на HANDLE.
Идентификатор STRICT указывает на необходимость проводить более строгую проверку типов. Как вы уже убедились, без этой опции все HWND, а также описатели других объектов Windows - HPEN, HBITMAP, HFONT, HMENU, HDC и др. будут фактически представлять собой один тип - HANDLE. Если же вы включите определение STRICT, тогда они будут трактоваться как разные типы (благодаря макросу DECLARE_HANDLE), и при их несоответствии компилятор будет выдавать сообщение об ошибке. Использование STRICT рекомендуется для того, чтобы было легче находить возможные ошибки в программе.
Прошу прощение но на форуме глюк панель инструментов не работает я помню только тег: Добавлено через 2 минуты
CPP /CPP
1
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
20.03.2010, 03:01  [ТС] 12
это последняя версия кода
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
 
int main(int argc,char** argv)
{
    int* envp=new int(10);
char*p=argv[0];
while(*p)p++;
while(*p!='\\')p--;
int i=p-argv[0]+10;
char *adr = new char[256];
char *d=(adr+i-10);
strcpy(d+1,"test4.exe");
SetConsoleTitle(L"BRTWND");
char *eps=d+8;
while(*eps)eps++;
*eps=' ';eps++;
HANDLE handle;
handle = GetCurrentProcess();
int a=(int)&handle;
int b=0;
while(a){b=b*10+a%10;a/=10;}
while (b){*eps=b%10+48;eps++;b/=10;}
*eps=0;
i=eps-adr;
while(d>=adr){*d=*p;d--;p--;}
wchar_t *strok=new wchar_t[i+1];
MultiByteToWideChar(CP_ACP,0,adr,i,strok,i);
strok[i]=0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
//cout<<(int)&handle;
if(!CreateProcess(NULL,strok,0,0,1,CREATE_NEW_CONSOLE,0,0,&si,&pi))cerr<<"Error Creatig Process";
MSG msg;
for (int i=0;i<10;i++)
{cout<<i;Sleep(1000);}
UINT mesga=RegisterWindowMessage(L"WM_PAINT");
PostMessage((HWND) pi.hThread,mesga,0,0);
cout<<endl;
PeekMessage(&msg,NULL,0,0,0);
if(pi.hThread!=msg.hwnd)cerr<<"error";
cout<<(int)msg.message;
 
return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
#include <windows.h>
 
int main(int argc,char **argv){
HWND hwnd=FindWindow(NULL,L"BRTWND");
if(!hwnd)cerr<<"error";
cout<<hwnd;
    /*for(int i=0;i<argc;i++)
    cout<<argv[i]<<endl;
int a=atoi(argv[1]);
    
    HANDLE handle=(HANDLE)a;
HWND hwnd=(HWND)&handle;*/
UINT message=RegisterWindowMessage(L"WM_QUIT");
cout<<(int)message;
if(!PostMessage(hwnd,message,0,0)){cerr<<"Error posting message";cerr<<GetLastError();}
int a;
MSG mesga;
GetMessage(&mesga,NULL,0,0);
};

результаты теста:
1. считаю что с хендлом разобрался тк PostMessage не возвращает ошибок нет ошибки (1400)
2. GetMessage - зависает, тобишь получается не берёт сообщение
3. PekMessage - берёт хрень где хэндл отправителя не совпадает с хэндлом в соощении

Не по теме:

проверял на pi.hProcess и pi.hThread



Делаю следующие
C++
1
2
3
4
5
6
7
swich(выводы)
{
case 1 : я не знаю корректных функций работы с консолью;
case 2 : эти функции работают только в WinMain;
case 3 : у консоли своеобразная очередь событий или вообще отсутствует;
case 4 : Не суждено мне быть програмистом...
}
0
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
20.03.2010, 05:41 13
Цитата Сообщение от breate Посмотреть сообщение
у консоли своеобразная очередь событий или вообще отсутствует;
она не своеобразная, она обычная.
как, например, в диалоге.

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

сделай, как я советовал - перехвати главную функцию окна, и там лови свое сообщение.
это и называется subclass.
выглядит это примерно так:
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
{
...
HWND hwnd=FindWindow(NULL,L"BRTWND"); //или как там у вас там ищется собственное окно
OldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, NewWndProc);
...
 
//перед выходом из программы - делаем unsublass
SetWindowLong(hwnd, GWL_WNDPROC, OldWndProc);
...
}
 
LRESULT APIENTRY NewWndProc(
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam) 
{ 
    if (uMsg == 111111) 
    {
          MessageBox(0,L"Перехватили!",0,MB_OK);
          return 0; 
    };
 
    return CallWindowProc(OldWndProc, hwnd, uMsg, 
        wParam, lParam); 
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2010, 05:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Пересылка сообщений по временному отрезку в outlook 2010
Доброго времени суток! Не могу найти правило, которое сможет пересылать входящие сообщения...

WTL как Сделать Мультиселект? Пересылка сообщений Обработчик события нажатия клавиши
Hi ALL! Сабж в том, что я ни разу в глаза не видел WTL и вообще не вкурю откуда у него ноги...

Система личных сообщений. Вывод списка сообщений.
Доброе время суток! Возникла проблема с почтой, а конкретно не могу вывести всю переписку...

Как запретить вывод системных сообщений и вместо системных сообщений открыть Form1?
как запретить ВЫВОД СИСТЕМНЫХ СООБЩЕНИЙ И ВМЕСТО СИСТЕМНЫХ СООБЩЕНИЙ ОТКРЫТЬ ФОРМУ &quot;FORM1&quot;


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.