Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передать значение переменной из одной программы в другую / 4 сообщений из 4, страница 1 из 1
25.03.2014, 01:17
    #38595259
Misha_cpp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение переменной из одной программы в другую
Всем добрый вечер.
Появилась такая задача:передать значение переменной из одной программы в другую ( в моём случае это переменная int a=10).

Реализовать это нужно через обработку сообщения WM_COPYDATA.
Появились проблемы с заполнением структуры COPYDATASTRUCT ( пишет , что IpData не является членом структуры ) .
Перечитал уже многое , но выход так и не нашёл .

Вот код первой программы ( отправителя ):

Код: plaintext
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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
#include <windows.h>
#include <windowsx.h>
#include <vector>  

int a=10;   //число , которое нужно передать в 2-ю программму
COPYDATASTRUCT p;  //экземпляр структуры

LRESULT CALLBACK HelloWorldWndProc(HWND,UINT,UINT,LONG);

HWND hw;  //дескриптор для поиска 2-ой программы 
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{ 
    WNDCLASS WndClass;
    WndClass.style=0;
    WndClass.lpfnWndProc=HelloWorldWndProc;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName=NULL;
    WndClass.lpszClassName=L"Класс1";
 
    if(!RegisterClass(&WndClass))
    {
        MessageBox(NULL,L"Невозможно зарегестрировать класс окна!",L"Ошибка",MB_OK);
        return 0;
    }
 
    HWND hWnd;   //дескриптор окна
    hWnd=CreateWindow(L"Класс1",L"Прога1",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    if(!hWnd)
    {
        MessageBox(NULL,L"Невозможно создать окно!",L"Ошибка",MB_OK);
        return 0;
    }
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    MSG Msg;
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

 //заполнение структуры
p.dwData=123;  //любое число
p.cbData=sizeof(a); //размер данных для передачи
p.lpData=&a;  // на первый байт данных

return Msg.wParam;
}

LRESULT CALLBACK HelloWorldWndProc(HWND hWnd,UINT Message,UINT wParam,LONG lParam)
{
    switch(Message)
    {
    case WM_DESTROY:
        {
        PostQuitMessage(0);
        }break;

 
	case WM_COPYDATA:
//отправка сообщения
hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
if(hw){MessageBox(NULL, L"Получатель найден", L"Ошибка", MB_OK);}
if(!hw){MessageBox(NULL, L"Получатель не найден", L"Ошибка", MB_OK);}
SendMessage(hw,WM_COPYDATA,(WPARAM)hWnd,(LPARAM)&p);
       break;
case WM_LBUTTONDOWN:
hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
if(hw){MessageBox(NULL, L"Получатель найден", L"Нету ошибки", MB_OK);}
if(!hw){MessageBox(NULL, L"Получатель не найден", L"Ошибка", MB_OK);}
break;
   
        return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}




а вот 2-я прога:

Код: plaintext
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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#include <windows.h> 
#include <iostream>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int a; //переменная, которую должны знаполнить 
COPYDATASTRUCT *pc;  //структура

// Главная функция:
int WINAPI WinMain(HINSTANCE hInst, 
                   HINSTANCE hPrevInst, 
                   LPSTR lpCmdLine,
                   int nCmdShow) 
{
    
    HWND hMainWnd; // создаём дескриптор будущего окошка
    MSG msg;
    WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
    wc.cbSize        = sizeof(wc); 
    wc.style         = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; 
    wc.lpfnWndProc   = WndProc;
    wc.lpszMenuName  =  0; 
    wc.lpszClassName = L"Класс получателя"; 
    wc.cbWndExtra    = NULL; 
    wc.cbClsExtra    = NULL; 
    wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); 
    wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO); 
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.hInstance     = hInst; 
    if(!RegisterClassEx(&wc)){
       
        MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
        return NULL; 
    }
    // Функция, создающая окошко:
    hMainWnd = CreateWindow(L"Класс получателя",L"Получатель",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
    if(!hMainWnd){
   
        MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
        return NULL;
    }
    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);
 
    while(GetMessage(&msg, NULL, NULL, NULL)){ 
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam; 
}
 //обратотка сообщений
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch(uMsg){
    case WM_DESTROY: 
        PostQuitMessage(NULL); 
        break;
    //получение данных

		case WM_COPYDATA:
        pc=(COPYDATASTRUCT*)lParam;
		a=int(pc->lpData);
break;
		case WM_LBUTTONDOWN:
		{

 char buf[10];
 ltoa(a,buf,10); 
 MessageBox(NULL,(LPCTSTR)buf,L"",MB_OK);

			break;
			}
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    }
return NULL; 
}




Не могу понять , правильно ли я во 2-ой программе обрабатываю сообщение WM_COPYDATA?

Код: plaintext
1.
2.
3.
4.
case WM_COPYDATA:
        pc=(COPYDATASTRUCT*)lParam;
		a=int(pc->lpData);
break;



скажите , пожалуйста , так ли нужно записывать полученное значение в а?
заранее спасибо за помощь!
...
Рейтинг: 0 / 0
25.03.2014, 02:51
    #38595275
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение переменной из одной программы в другую
Misha_cppНе могу понять , правильно ли я во 2-ой программе обрабатываю сообщение
WM_COPYDATA?
Неправильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2014, 02:56
    #38595277
Misha_cpp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение переменной из одной программы в другую
Dimitry Sibiryakov, да это я уже понял , что неправильно ; только не могу понять - почему ?? что не так-то ? подскажите , пожалуйста
...
Рейтинг: 0 / 0
25.03.2014, 13:32
    #38595672
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение переменной из одной программы в другую
Misha_cppчто не так-то ?
Не к тому типу приводишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передать значение переменной из одной программы в другую / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]