С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
1

Передача других типов переменных через тип LPVOID

07.10.2015, 23:00. Просмотров 760. Ответов 32
Метки нет (Все метки)

Добрый вечер.
В функцию нужно передать переменную типа
C++
1
Awesomium::WebView*
А функция принимает тип
C++
1
LPVOID
Передаю так:
C++
1
2
3
Awesomium::WebView* caller;
LPVOID pDataArray[1];
pDataArray[1] = (Awesomium::WebView*)caller;
Пытаюсь принять так:
C++
1
2
LPVOID pDataArray;
Awesomium::WebView* caller = (Awesomium::WebView*)pDataArray[1];
но делаю не то.

Подскажите, как надо?

Добавлено через 1 час 23 минуты
Теперь передаю так:
C++
1
2
3
Awesomium::WebView* caller;
LPVOID pDataArray[1];
pDataArray[1] = caller;
Принимаю так:
C++
1
2
3
LPVOID pDataArray
Awesomium::WebView* caller;
caller = (Awesomium::WebView*)pDataArray;
Компилируется без ошибок.

Но когда используется переменная caller, то выдает ошибку.

Что не правильно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2015, 23:00
Ответы с готовыми решениями:

В чем особенность функции типа void от других типов?
В чем особенность функции типа void от других типов?

Преобразование типов переменных
Осуществить преобразование типов переменных явным и неявным способом по...

Объявление переменных различных типов
Совсем не понимаю задачу Помогите пожалуйста!!...

Цвет собственных типов переменных в C++
Здрасте! Что необходимо сделать, чтобы собственные типы переменных в окне "Код"...

Ввод и вывод типов переменных
Ребята, помогите пожалуйста! У меня практика, а c++ builder вообще не...

32
nmcf
6516 / 5745 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
07.10.2015, 23:07 2
В массиве 1 элемент, значит максимальный индекс 0, у тебя 1. И зачем вообще массив здесь?
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
07.10.2015, 23:31  [ТС] 3
nmcf, потому что иначе не получается передать

Добавлено через 44 секунды
nmcf, сделал так:
C++
1
2
3
Awesomium::WebView* caller;
LPVOID pDataArray[1];
pDataArray[0] = caller;
А ошибка та же

Добавлено через 40 секунд
В функцию передается это:
C++
1
pDataArray[0]
А функция принимает просто как переменную, не массив

Добавлено через 6 минут
Теперь так сделал.

Передача:
C++
1
2
3
Awesomium::WebView* caller,
Awesomium::WebView* pDataArray[1];
pDataArray[0] = caller;
Прием:
C++
1
2
3
LPVOID lpParam
Awesomium::WebView* caller;
caller = (Awesomium::WebView*)lpParam;
Уже лучше. А ошибка та же.

Добавлено через 14 минут
Да. Можно без массива.

Передача:
C++
1
2
3
Awesomium::WebView* caller;
Awesomium::WebView* pDataArray;
pDataArray = (Awesomium::WebView*)caller;
Но в преобразовании:
C++
1
caller = (Awesomium::WebView*)lpParam;
теряется указатель. И переменная caller получается пустая.
0
nmcf
6516 / 5745 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
07.10.2015, 23:52 4
Не может он теряться. Что такое Awesomium::WebView*? Это указатель на что?
Покажи как выглядит этот WebView и как объявлена принимающая функция.
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
07.10.2015, 23:55  [ТС] 5
nmcf, Принимающая функция:
C++
1
DWORD WINAPI MyThreadFunction(LPVOID lpParam) {
WebView:
C++
1
2
3
4
virtual WebView* CreateWebView(int width,
                                 int height,
                                 WebSession* session = 0,
                                 WebViewType type = kWebViewType_Offscreen) = 0;
0
nmcf
6516 / 5745 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
07.10.2015, 23:59 6
Это функция-член класса? Ты же её не сможешь вызвать саму по себе, без объекта.
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 00:13  [ТС] 7
nmcf, вызываю саму по себе таким образом:
C++
1
2
3
4
5
6
7
HANDLE hThreadArray = CreateThread(
                NULL,                   // default security attributes
                0,                      // use default stack size  
                MyThreadFunction,       // thread function name
                caller,          // argument to thread function 
                0,                      // use default creation flags 
                &dwThreadIdArray);
Добавлено через 9 минут
В функцию MyThreadFunction значение приходит, типа LPVOID.
Преобразуя LPVOID в WebView* значение становится 0
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 00:27 8
Цитата Сообщение от Randen Посмотреть сообщение
caller, * * * * *// argument to thread function
кто такой caller? как обьявлен?
0
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 00:31  [ТС] 9
ValeryS,
C++
1
Awesomium::WebView* caller
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 00:36 10
lpParameter
[in] Указатель на переменную, которая передается в поток.
отсюда http://webcache.googleusercontent.co...gbv=2&&ct=clnk
я объявленных переменных не видел, только указатели

Добавлено через 3 минуты
Цитата Сообщение от Randen Посмотреть сообщение
Awesomium::WebView* caller
так это указатель ( и то с натяжкой)а тебе нужна переменная
типа
C++
1
2
3
4
5
6
7
8
 Awesomium::WebView caller;
HANDLE hThreadArray = CreateThread(
                NULL,                   // default security attributes
                0,                      // use default stack size  
                MyThreadFunction,       // thread function name
                &caller,          // argument to thread function 
                0,                      // use default creation flags 
                &dwThreadIdArray);
но это не проканает потому что
C++
1
Awesomium::WebView caller;
нельзя так создать переменную
странный тип Awesomium::WebView
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 00:37  [ТС] 11
Через глобальную переменную выяснил что не в переменной дело.

Но почему в асинхронном потоке не выполняется то, что выполняется в главном?
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 00:42 12
Цитата Сообщение от Randen Посмотреть сообщение
Через глобальную переменную выяснил что не в переменной дело.
ты много еще можешь выяснить
зайди на сайт http://www.firststeps.ru/
и посмотри как создаются потоки
тебе нужен указатель на конкретную выделенную память(переменная, структура, класс), для того нужно или взять адрес, или выделить память при помощи new, а не указатель который указывает в космос
0
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 00:59  [ТС] 13
ValeryS, если вы знаете как это сделать, то поделитесь, пожалуйста, нужной инфой. Потому что там кроме того что сайт ужасный и не удобный. Дак еще и куча лишней инфы, среди которой без поиска можно жизнь провести

Добавлено через 6 минут
ValeryS, либо я вас не понял, либо вы меня.
Вот объявляется указатель:
C++
1
WebView* web_view;
Вот присваивается ему адрес:
C++
1
web_view = view_->web_view();
Далее я могу с ним работать как и должно быть. Но в асинхронном потоке работать с ним не получается!
Почему?
На сайте одна страница про потоки:
http://www.firststeps.ru/mfc/steps/r.php?128
Ответа там нет.

Добавлено через 2 минуты
Еще уточню, что в асинхронном потоке работает всё, кроме работы с этим указателем WebView*
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 01:06 14
Цитата Сообщение от Randen Посмотреть сообщение
Дак еще и куча лишней инфы,
лишней инфы не бывает там хорошо описаны потроха винды
Цитата Сообщение от Randen Посмотреть сообщение
если вы знаете как это сделать,
я же показал
ну вот еще раз
C++
1
2
3
4
5
6
7
8
int parametr;
HANDLE hThreadArray = CreateThread(
                NULL,                   //  дескриптор защиты
                0,                      // Начальный размер стека, в байтах, по умолчанию 
                MyThreadFunction,       // функция отока
                &parametr,          //  Указатель на переменную, которая передается в поток.
                0,                      // Флажки, которые управляют созданием потока. Поток создается сразу
                NULL);//Указатель на переменную, которая принимает идентификатор потока. нет такой
ну можешь еще здесь посмотреть, вроде толково расписано
http://eax.me/winapi-threads/

Добавлено через 1 минуту
Цитата Сообщение от Randen Посмотреть сообщение
Далее я могу с ним работать как и должно быть. Но в асинхронном потоке работать с ним не получается!
этот указатель глобальный?
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 01:08  [ТС] 15
ValeryS, сделал его глобальным, дабы проверить. И ошибка не в передаче переменной потоку, а в самом потоке или что там я уже не знаю)
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 01:11 16
Цитата Сообщение от Randen Посмотреть сообщение
или что там я уже не знаю)
а я тем более кода то я не вижу
приведи код функции потока

Добавлено через 1 минуту
поток в отдельной единице трансляции( отдельный Си файл)?
знает ли он что такое WebView*?
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 01:15  [ТС] 17
ValeryS,
C++
1
2
3
4
5
6
WebView* g_caller;
 
DWORD WINAPI MyThreadFunction(LPVOID lpParam) {
    WebView* caller = (WebView*)lpParam;
    LPSTR code = "document.getElementById('title').innerHTML = 'Изменения'";
    JSValue result = g_caller->ExecuteJavascriptWithResult(Awesomium::WSLit(code), Awesomium::WSLit(""));
Ошибка на 3 строке внутри функции.

До запуска потока в переменную g_caller занесен адрес web_view.

До запуска потока строка
C++
1
JSValue result = g_caller->ExecuteJavascriptWithResult(Awesomium::WSLit(code), Awesomium::WSLit(""));
Работает как и должна
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 01:15 18
появилась еще одна мысль
что возвращает web_view();? может он возвращает состояние внутреннего буфера?
попробуй передать функции указатель на view_;
а в функции уже сделать
C++
1
view_->web_view();
1
Randen
35 / 35 / 15
Регистрация: 06.01.2014
Сообщений: 707
08.10.2015, 01:18  [ТС] 19
ValeryS, всё в одном файле

Добавлено через 3 минуты
ValeryS,
C++
1
g_caller = view_->web_view();
внутри потока срабатывает. Но потом та же ошибка на g_caller
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,950
08.10.2015, 01:19 20
Цитата Сообщение от Randen Посмотреть сообщение
WebView* g_caller;
указатель в воздух
потому что
Цитата Сообщение от Randen Посмотреть сообщение
WebView* caller = (WebView*)lpParam;
создаешь локальный указатель и приводишь к нему аргумент
а используешь глобальный, вот он и твой NULL
попробуй
C++
1
 JSValue result = caller->ExecuteJavascriptWithResult(Awesomium::WSLit(code), Awesomium::WSLit(""));
1
08.10.2015, 01:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2015, 01:19

Сравнение переменных разных типов
Здравствуйте. Столкнулся с проблемой не совпадения типов данных. Есть...

Ввод значений переменных различных типов
Всем доброго вечера. возникла проблемка с одним задание: Ввод значений...

Как записать в переменную значения других переменных?
Как мне сделать так, чтобы в 3 строке были их значения? String login =...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru