Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как правильно получить значение по адресу,


Автор: Coder 11.4.2007, 17:00
есть 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. адрес передается правильный - проверенно в отладчиках.

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

Автор: Coder 11.4.2007, 17:25
извиняюсь, я ошибся когда писал. TWpt = Txy

xy = (Txy *)wParam; - не работает. я такой код уже проверял.

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

и видимо не только там. давай нормалный свой кой, так будет продуктивней

Автор: ama_kid 11.4.2007, 17:29
а xy у тебя объявлен объектом или указателем на объект?
Txy *xy;

Автор: Coder 11.4.2007, 17:35
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;


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

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

что не работает и как? код корректный

Автор: Coder 11.4.2007, 17:48
получаю сообщение SET_XY, смотрю значение xy.x и xy.y в отладчике - там нули (они остаются после очистки ZeroMemory), хотя я в DLL пишу отличные от нуля цифры.

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

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

Автор: Coder 11.4.2007, 17:57
Integer - 4 байта, тут все нормально. для уверенности пробовал Cardinal (это безнаковый Integer)

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

Автор: fantast 11.4.2007, 18:19
дело говорит  smile 

Автор: Coder 12.4.2007, 00:44
ama_kid, попробую.

но вот так wParam = x, lParam =y... не получится - у меня больше данных это всего лишь пример

Автор: HappyLife 12.4.2007, 13:05
ama_kid, 
При включенное галке, Built With Runtime Libraries
область памяти одна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)