Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как правильно получить значение по адресу, который находится в wParam? 
:(
    Опции темы
Coder
Дата 11.4.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



есть DLL (Delphi) и основная программа (VC++). Из DLL идет передача указателя на структуру:
Код

  Txy = record
    x, y : double;
  end;
  ...
  var
    xy : Txy;
  ...
  xy.lat:=lat;
  xy.lon:=lon;
  SendMessage(primHWND,SET_XY,Integer(@Wpt),0);


в VC ловим это сообщение:

Код

struct Txy{
    double x, y;
};

..

Txy xy;

case SET_XY:  // *** 
    ZeroMemory(&wpt,sizeof(TWpt));
    memcpy(&wpt,(TWpt*)wParam,sizeof(TWpt));
    break;



*** - вот здесь проблемы - как правильно скопировать то что находится по адресу wParam в переменную xy? 
перепробывал несколько вариантов, но ничего не получается.

P.S. адрес передается правильный - проверенно в отладчиках.
PM MAIL   Вверх
ama_kid
Дата 11.4.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Чот не понял, как соотносится TWpt и Txy, но примерно так:
...
Txy *xy;
...
xy = (Txy *)wParam;


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Coder
Дата 11.4.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



извиняюсь, я ошибся когда писал. TWpt = Txy

xy = (Txy *)wParam; - не работает. я такой код уже проверял.
PM MAIL   Вверх
Daevaorn
Дата 11.4.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Coder @  11.4.2007,  18:25 Найти цитируемый пост)
извиняюсь, я ошибся когда писал. TWpt = Txy

и видимо не только там. давай нормалный свой кой, так будет продуктивней
PM MAIL WWW   Вверх
ama_kid
Дата 11.4.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



а xy у тебя объявлен объектом или указателем на объект?
Txy *xy;


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Coder
Дата 11.4.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



ama_kid, как указатель (когда по твоему варианту).

вот нормальный код (у меня на часах 1:30 ночи - причина ошибок):

Код

  Txy = record
    x, y : double;
  end;
  ...
  var
    xy : Txy;
  ...
  xy.x:=x;
  xy.y:=y;
  SendMessage(primHWND,SET_XY,Integer(@xy),0);


Код

struct Txy{
    double x, y;
};

..

Txy xy;

case SET_XY:  // *** 
    ZeroMemory(&xy,sizeof(Txy));
    memcpy(&xy,(Txy*)wParam,sizeof(Txy));
    break;



Это сообщение отредактировал(а) Coder - 11.4.2007, 17:38
PM MAIL   Вверх
Daevaorn
Дата 11.4.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Coder @  11.4.2007,  18:35 Найти цитируемый пост)
вот нормальный код (у меня на часах 1:30 ночи - причина ошибок):

ок
Цитата(Coder @  11.4.2007,  18:25 Найти цитируемый пост)
не работает. я такой код уже проверял.

что не работает и как? код корректный
PM MAIL WWW   Вверх
Coder
Дата 11.4.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



получаю сообщение SET_XY, смотрю значение xy.x и xy.y в отладчике - там нули (они остаются после очистки ZeroMemory), хотя я в DLL пишу отличные от нуля цифры.
PM MAIL   Вверх
fantast
Дата 11.4.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



Цитата(Coder @  11.4.2007,  17:35 Найти цитируемый пост)
SendMessage(primHWND,SET_XY,Integer(@xy),0);

а это нормально что ты адрес преобразовывал в integer, я ващето паскаль тока в школе проходил и то до указателей дело не дошло,
но мне кажется что в любом случае байт для адреса не хватит после такого преобразования.
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Coder
Дата 11.4.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Integer - 4 байта, тут все нормально. для уверенности пробовал Cardinal (это безнаковый Integer)
PM MAIL   Вверх
ama_kid
Дата 11.4.2007, 18:07 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Coder
Хм... Погоди-ка... Вообще-то для передачи данных существует специальное сообщение WM_COPYDATA. У Dll - своя область памяти, у приложения - своя, они вообще-то не пересекаются... А если DLL скомпилена с включенной галкой Built With Runtime Libraries - тогда точно труба... Ты адрес-то передаешь, но этот адрес валиден только в самой длл. Как приложени должно вытаскивать эти данные из сегмента данных DLL? Ты эту область расшарил?
Используй WM_COPYDATA, если тебе надо передавать какие-то данные... А в твоем случае я бы использовать wParam = x, lParam =y...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
fantast
Дата 11.4.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



дело говорит  smile 
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Coder
Дата 12.4.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



ama_kid, попробую.

но вот так wParam = x, lParam =y... не получится - у меня больше данных это всего лишь пример
PM MAIL   Вверх
HappyLife
Дата 12.4.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



ama_kid, 
При включенное галке, Built With Runtime Libraries
область памяти одна.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.