Как скопировать данные из одного приложения Windows в другое? - PullRequest
2 голосов
/ 23 марта 2012

Мне нужно перенести данные в win api из одного приложения в другое.В одном приложении я имею:

msg_number=RegisterWindowMessage(MY_WINDOW_MSG);
cp_struct.lpData = &fig;
cp_struct.dwData = sizeof(Figure);
cp_struct.cbData = 6666;
SendMessage(HWND_BROADCAST, msg_number, 0, (LPARAM)&cp_struct); 

В другом:

case WM_CREATE:
{
    msg_number=RegisterWindowMessage(TEXT(MY_WINDOW_MSG));  
}
if(msg_number != 0 && msg == msg_number)
{
    reciver_struct = (PCOPYDATASTRUCT)(lParam);
    printf("get it %d\n", reciver_struct->cbData);
    return 0;
}

Но в этом приложении-получателе я вижу, что приложение получает сообщение, но не со значениями из моей структуры.

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

У вас правильная идея, но вы используете неправильное сообщение. Вам нужно присвоить значение от RegisterWindowMessage() до cp_struct.dwData, назначить длину байта ваших данных cp_struct.cdData, а затем отправить cp_struct с помощью сообщения WM_COPYDATA (вам нужно использовать фактическое HWND другого приложения, не HWND_BROADCAST), например:

msg_number = RegisterWindowMessage(MY_WINDOW_MSG); 
if (msg_number != 0)
{
    cp_struct.dwData = msg_number; 
    cp_struct.lpData = &fig; 
    cp_struct.cbData = sizeof(Figure); 
    SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cp_struct);  
}

.

case WM_CREATE: 
{ 
    msg_number = RegisterWindowMessage(MY_WINDOW_MSG);
    break;
} 

case WM_COPYDATA:
{
    reciver_struct = (PCOPYDATASTRUCT)(lParam); 
    if ((msg_number != 0) && (reciver_struct->dwData == msg_number))
    { 
        Figure *figure = (Figure*) cp_struct.lpData; 
        ... use figure as needed ...
        return 0; 
    } 

    ... pass the message to a default handler for processing ...
    break;
}
2 голосов
/ 24 марта 2012

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

Вы можете использовать что-то вроде ReadProcessMemory, чтобы сделать эту работу, но для этого потребуются некоторые реальные усилия.

Гораздо проще просто позволить Windows позаботиться о тяжелой работе за вас, используя сообщение WM_COPYDATA. Пример доступен здесь .

Осторожно, хотя: WM_COPYDATA заблокирован UIPI в Windows Vista и более поздних версиях. Вам нужно внести в белый список это конкретное сообщение, вызвав функцию ChangeWindowMessageFilter (в Vista) или ChangeWindowMessageFilterEx (в Win 7 или более поздней версии).

0 голосов
/ 24 марта 2012

Если у вас есть доступ к Boost, рассмотрите Boost.Interprocess . Если у вас нет доступа к boost, вы можете использовать любое количество методов Win API для IPC .

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