Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
2 / 2 / 2
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1

WM_COPYDATA не получается перевести в строку

16.01.2016, 13:09. Показов 1430. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Облазил весь интернет, не получается перевести LPARAM в строку (хоть какой нибудь текст).
Пишу MsnLive приемник (Есть программа, которая отправляет в окно с классом MsnMsgrUIManager текстовое сообщение в параметре lParam 99%)
Я написал
C++
1
2
3
4
5
6
7
8
9
10
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) {
    case WM_COPYDATA: 
                // тут я пытался вывести строку из lParam
        return 0;
    default:
        return(DefWindowProc(hwnd, msg, wParam, lParam));
    }
}
WndProc хорошо работает, каждый раз, когда программа отправляет сообщение, WM_COPYDATA срабатывает.
wParam = 0
msg = 74 (просто это напишу)
Способы, которые я использовал в попытке чтения строки, не могу перечислить. НО знаю что на C# это работало(
А именно в C# коде использовалось следующее:
C#
1
2
3
4
5
if (msg == 74u)
            {
                MSNWindow.COPYDATASTRUCT cOPYDATASTRUCT = (MSNWindow.COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(MSNWindow.COPYDATASTRUCT));
                string text = Marshal.PtrToStringUni(cOPYDATASTRUCT.lpData, cOPYDATASTRUCT.cbData / 2);
            }
Но на C++ я не представляю как это сделать. Подобия Marshal (Пишу я на C++11) не нашел, что бы указатель(Ptr) перевести в структуру/строку.

P.S. а может у кого то будет уже готовый пример по работе с MSNLive (Нужно просто прочитать сообщение, которое отправляется через SendMessage в другой программе)

Немного подробностей о программе отправки:
Отправляет структуру
1 значение - 1351 (Сам не знаю зачем, просто так есть, программа отправки не моя, но она рабочая 100%)
2 - текст
3 - длина текста * 2
Сама по себе, это программа - транслятор текущей играющей музыки. Отправляет в MSNLive текст, содержащий название песни, автора. Но этот текст мне не удается прочитать.

И на последок, код окна, с классом MSNLive
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, LPTSTR, int)
{
    TCHAR szClassName[] = WMP_WINDOWCLASS; // #define WMP_WINDOWCLASS "MsnMsgrUIManager"
    TCHAR szTitle[] = ""; //Заголовок не нужен
    MSG Msg;
    WNDCLASS wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
    wc.lpszClassName = szClassName;
    RegisterClass(&wc);
    HWND hwnd = CreateWindow(szClassName, szTitle, WS_POPUP, 10, 10, 300, 100, HWND_DESKTOP, NULL, hInst, NULL);
    ShowWindow(hwnd, SW_SHOWNORMAL);
    while (GetMessage(&Msg, NULL, 0, 0))
        DispatchMessage(&Msg);
    return 0;
}
А запускаю из main:
C++
1
_tWinMain(0, 0, 0, 0); // Создаем окошко, все по нулям, не знаю какие передавать параметры, поставил нули, может из за этого и не получается
Добавлено через 13 часов 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    LPCTSTR lpszString;
    COPYDATASTRUCT* pcds;
    switch (msg) {
    case WM_COPYDATA: // ~~~ message ~~~
        pcds = (COPYDATASTRUCT*)lParam;
        lpszString = (static_cast<const LPCTSTR >(pcds->lpData));
        std::cout << lpszString << "(" << pcds->cbData << ")\n";
        return 0;
    default:
        return(DefWindowProc(hwnd, msg, wParam, lParam));
    }
}
Попытался сделать так, выводит "/" постоянно. В общем, как перевести lpData (PVOID) в строку?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2016, 13:09
Ответы с готовыми решениями:

Не получается перевести 2 массива в строку
Здравствуйте всем. Вобщем, курсовая, заданее следущее: написать класс для чисел единый, чтобы можно было складывать разные типы, int...

WM_COPYDATA передает только 1й символ, а не всю строку
Доброго времени суток уважаемые знатоки! Подскажите мне пожалуйста, что я делаю не так. Суть. Программа должна отправлять игре Dota 2...

Ввести строку, число N. Вывести введенную строку на экран N раз (перевести в 32 битную версию)
org 100h mov ah,9 mov dx,msg1 int 21h mov ah,0ah ...

4
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.01.2016, 17:07
Лучший ответ Сообщение было отмечено AndreySeVeN как решение

Решение

Цитата Сообщение от AndreySeVeN Посмотреть сообщение
Немного подробностей о программе отправки:
Отправляет структуру
1 значение - 1351 (Сам не знаю зачем, просто так есть, программа отправки не моя, но она рабочая 100%)
2 - текст
3 - длина текста * 2
Раз "длина текста * 2", то это, скорее всего, строка в "широких символах"
(UTF-16, 2 байта на символ). Поэтому выводить ее нужно не в std::cout, а в
std::wcout, а еще лучше сначала в MessageBoxW для проверки.
1
2 / 2 / 2
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1
16.01.2016, 17:26  [ТС]
Убежденный, Спасибо большое. std::wcout работает идеально!!! Я 2 дня с этим мучался. Большущее спасибо. Но я вижу текст не полным каким то. Там есть {0} {1} {2} [{3}], на месте которых по идеи должны быть другие параметры.
Точнее там точно должны быть какие то значения. Но видимо их надо по-другому подставлять

Добавлено через 4 минуты
Убежденный,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string[] separator = new string[]
                {
                    "\\0"
                };
                string[] array = text.Split(separator, StringSplitOptions.None);
                if (array[2] == "0")
                {
                    MSNWindow.status = null;
                }
                else
                {
                    string[] array2 = new string[array.Length - 5];
                    Array.Copy(array, 4, array2, 0, array.Length - 5);
                    MSNWindow.status = string.Format(array[3], array2);
                }
Вот такой код использовался в C#... На c++ конечно будет посложнее
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.01.2016, 17:30
Цитата Сообщение от AndreySeVeN Посмотреть сообщение
Там есть {0} {1} {2} [{3}], на месте которых по идеи должны быть другие параметры.
Точнее там точно должны быть какие то значения. Но видимо их надо по-другому подставлять
Это уже специфика данного приложения. WM_COPYDATA же просто передает через
оконное сообщение буфер того размера, который ей указали, и все, никаких
"подстановок аргументов" она не выполняет.
1
2 / 2 / 2
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1
16.01.2016, 18:53  [ТС]
Убежденный,
C#
1
2
3
string[] array2 = new string[array.Length - 5];
                    Array.Copy(array, 4, array2, 0, array.Length - 5);
                    MSNWindow.status = string.Format(array[3], array2);
Даже не могу представить, как это сделать на c++

Добавлено через 9 минут
Убежденный, надо использовать, что то вроде sprintf?

Добавлено через 1 час 12 минут
Убежденный, а все. Оказалось там не используется никаких вставок. MSNLive окно получает именно такую строку, вместе со всякими символами. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2016, 18:53
Помогаю со студенческими работами здесь

Перевести длинную бинарную строку в строку с десятичными цифрами
Добрый день. Проблема следующая: есть бинарное число 11010111010111111110.......11100011010110110 - необходимо его представить в виде...

Запросить строку и получить из неё строку,которая получается из данной чтением справа-налево
Запросить строку и получить из неё строку,которая получается из данной чтением справа-налево

Запросить строку и получить из нее строку,которая получается из данной чтение справа-налево
Можно в АБС?? и Блок схему плиз Добавлено через 17 часов 38 минут Завтра сдавать нужно уже,помогите плиз

Как перевести строку из LineEdit в строку кода
Здравствуйте. У меня дано задание рассчитать интеграл от функции f(x)*exp(iwx), причем функцию f(x) я должен вводить через форму. Все...

Не получается перевести задачу с с++ на с#
Сама задача: The program fragment below performs binary search of an integer number in an array that is sorted in a nondescending...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru