powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передать значение переменной из одной программы в другую
4 сообщений из 4, страница 1 из 1
Передать значение переменной из одной программы в другую
    #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
Передать значение переменной из одной программы в другую
    #38595275
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha_cppНе могу понять , правильно ли я во 2-ой программе обрабатываю сообщение
WM_COPYDATA?
Неправильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передать значение переменной из одной программы в другую
    #38595277
Misha_cpp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, да это я уже понял , что неправильно ; только не могу понять - почему ?? что не так-то ? подскажите , пожалуйста
...
Рейтинг: 0 / 0
Передать значение переменной из одной программы в другую
    #38595672
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha_cppчто не так-то ?
Не к тому типу приводишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передать значение переменной из одной программы в другую
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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