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

Передача указателя на класс через SendMessage

17.12.2015, 13:52. Показов 1549. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Не получается передать указатель на экземпляр класса через SendMessage.

Передаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WebView* web_view;
web_view = web_core->CreateWebView(WIDTH, HEIGHT, 0, 0);
    
char c_web_view[9];
sprintf_s(c_web_view, 9, "%p", web_view);
 
COPYDATASTRUCT Send_Data;
Send_Data.dwData = _number;
Send_Data.cbData = sizeof(c_web_view);
Send_Data.lpData = c_web_view;
 
SendMessage(_parent_hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&Send_Data);
 
std::stringstream aa;
aa << web_view;
 
MessageBoxA(0, aa.str().c_str(), "Передача", 0);
Принимаю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    case WM_COPYDATA:
        PCOPYDATASTRUCT Get_Data;
        Get_Data = (PCOPYDATASTRUCT)lParam;
        if (Get_Data->dwData > 0) {
            char* c_web_view_item = (char*)Get_Data->lpData;
            WebView* web_view_item;
            sscanf_s(c_web_view_item, "%p", &web_view_item);
 
            std::stringstream aa;
            aa << web_view_item;
            MessageBoxA(0, aa.str().c_str(), "Прием", 0);
        }
        break;
По меседжу значение у web_view одинаковое на обеих сторонах. Но после приема доступа к методам класса нет. Приложение выдает ошибку при попытке обратится к методам.

Добавлено через 10 часов 0 минут
Ап.

Добавлено через 36 минут
Вот так надо
Прием:
C++
1
2
3
4
5
WebView* web_view_item = (WebView*)Get_Data->lpData;
 
std::stringstream aa;
aa << web_view_item;
MessageBoxA(0, aa.str().c_str(), "Прием", 0);
Передача:
C++
1
2
3
4
5
6
7
8
9
10
        COPYDATASTRUCT Send_Data;
        Send_Data.dwData = _number;
        Send_Data.cbData = sizeof(WebView);
        Send_Data.lpData = web_view;
 
        SendMessage(_parent_hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&Send_Data);
 
        std::stringstream aa;
        aa << web_view;
        MessageBoxA(0, aa.str().c_str(), "Передача", 0);
Но тут уже проблема с указателем. Принимается другое значение.
Но если передавать также мой созданный класс типа:
C++
1
2
3
4
class My_Class {
public:
    int var = 5;
};
То передается как надо.

Почему так?

Добавлено через 2 часа 56 минут
Никак не получается
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2015, 13:52
Ответы с готовыми решениями:

Передача Float через SendMessage(LParam)
Возможно глупый вопрос, но ситуация следующая: bool __fastcall TForm1::DataWaveIn(HWND hWnd, HWAVEIN hWaveIn, LPWAVEHDR pHdr) { ...

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

Передача указателя функции класса A в класс B
Добрый день! Стоит задача вызывать функцию другого класса в потоке, ну что то типа этого: typedef void (t1::*PTR_FUN)(int);...

11
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
17.12.2015, 14:00
Цитата Сообщение от Randen Посмотреть сообщение
case WM_COPYDATA:
PCOPYDATASTRUCT Get_Data;
Get_Data = (PCOPYDATASTRUCT)lParam;
if (Get_Data->dwData > 0) {
а почему не
COPYDATASTRUCT* pGet_Data;
pGet_Data = (COPYDATASTRUCT*)lParam;

Я не уверен, но Попробуй..
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
17.12.2015, 14:09  [ТС]
SSC, P означает Pointer - указатель.)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.12.2015, 16:00
Если нужно передать значение web_view, тогда проще так:
C++
1
2
3
4
5
6
COPYDATASTRUCT Send_Data;
Send_Data.dwData = _number;
Send_Data.cbData = sizeof(web_view);
Send_Data.lpData = &web_view;
 
SendMessage(_parent_hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&Send_Data);
1
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
17.12.2015, 16:01  [ТС]
Убежденный, так пробовал. Суть в том что мой класс, приведенный выше, передается нормально. А класс WebView* нет. Нет доступа к методам.

Я попробовал засунуть указатель WebView* в мой класс My_Class.
Передается. Значение WebView совпадает. Но доступа к методам все равно нет.

Почему?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.12.2015, 16:57
Вы ведь передаёте и принимаете указатель в рамках одного процесса?
Сори, не заметил этого: Send_Data.cbData = sizeof(WebView);

Добавлено через 5 минут
Надо посмотреть на класс WebView, может у него есть таблица виртуальных методов
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.12.2015, 10:40
Цитата Сообщение от Randen Посмотреть сообщение
Нет доступа к методам
Какая ошибка?

Randen, ты же, я надеюсь, не пытаешься передать указатель
на объект в другой процесс?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
18.12.2015, 11:04
Убежденный, я тоже об этом подумал сразу (был тут недавно случай, когда хотели записать/прочитать из файла структуру с указателем на массив в куче). Но cbData = sizeof(WebView), т.е. передаёт "структуру" WebView целиком (имеет место быть побайтовое копирование), и если этот класс содержит виртуальные методы, то они не будут работать в другом процессе, однозначно.
class My_Class у него передаётся нормально. Надо смотреть на класс WebView.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.12.2015, 12:31
Не проверял, но скорее всего (по логике вещей), обычные методы
тоже не будут работать. Ведь другой процесс про них "ничего не знает",
там нет нужных функций. Так можно передавать разве что структуру в
стиле C с простыми членами. И даже при этом еще следует позаботиться о
согласованном выравнивании и размерах типов.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
18.12.2015, 12:50
С выравниванием может быть косяк, но если опустить этот момент (т.е. sizeof классов в обоих приложениях одинаковый), то достаточно описать этот класс в приложении-приемнике (если он не будет содержать ни таблицу вирт. методов, ни указателей), то методы отработают. Оно и получится, что передаём Си структуру, и описываем для неё функуии (методы класса). Но это уже не по стандарту плюсов.
Уйти от передачи экземпляра класса и передавать массивом POD типа (исключаем выравнивание), как и указано в самом начале, но кастить эти данные к классу лучше не стоит.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.12.2015, 13:00
А еще лучше сразу взять Boost.Serialization и забыть про эти проблемы.
В том числе и проблемы с виртуальными методами.
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
18.12.2015, 18:27
Цитата Сообщение от Randen Посмотреть сообщение
C++
1
2
3
4
COPYDATASTRUCT Send_Data;
Send_Data.dwData = _number;
Send_Data.cbData = sizeof(c_web_view);
Send_Data.lpData = c_web_view;
Randen, число 11223344 и строка "11223344" - в чем разница?
Цитата Сообщение от Randen Посмотреть сообщение
значение у web_view одинаковое на обеих сторонах
Randen, значение не одинаковое, а в одном случае число 11223344, в другом случае строка "11223344"

Добавлено через 37 минут
Цитата Сообщение от Alex5 Посмотреть сообщение
Randen, значение не одинаковое, а в одном случае число 11223344, в другом случае строка "11223344"
Здесь я сам, кажется, ошибся.
Randen, зачем указатель переводить в char[], а потом обратно в (WebView*).

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//   Хотим передать указатель   p
 
        Send_Data.cbData = sizeof( & WebView ); 
        Send_Data.lpData = &p;
 
 
//  Получаем указатель 
 
      WebView* p =  *(WebView**) Get_Data->lpData;  
 
//    Get_Data->lpData  -  это указатель на данные, которые мы передали  
//    мы передали   WebView*
//    Get_Data->lpData  -   это указатель на   WebView*
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2015, 18:27
Помогаю со студенческими работами здесь

Передача указателя в класс на объект другого класса
Не могу передать ссылку на объект класса в другой класс main.cpp #include &lt;iostream&gt; #include &quot;test\class_a.h&quot; ...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Передача указателя на объект класса через this
Всем участникам форума горячий ПРИВЕТ! Вопрос такой. cl.h class cl { public: void cl(); int a; private: DWORD...

Напишите программу, которая будет выводить слова через класс( методом указателя this)
нужна маленькая помощь

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru