AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.04.2006, 12:53   #1  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
? Как получить указатель на объект?
Доброго времени суток!
Собствено, сабж. Есть экземпляр класса Binary. Требуется получить его адрес и запихнуть в другой Binary. Вот такое извращение. Не спрашивайте, зачем это надо ))
Старый 28.04.2006, 13:05   #2  
Косых Артём is offline
Косых Артём
Участник
Axapta Retail User
 
123 / 77 (3) ++++
Регистрация: 03.09.2004
Адрес: Москва
Взято отсюда: Сохранение/восстановление буфера обмена

Код:
client server static void copyMemory(Binary _dest, Binary _source, int _size)
{
    DLL         winApiDLL     = new DLL('KERNEL32');
    DLLFunction copyMemory    = new DLLFunction(winApiDLL, 'RtlMoveMemory');

    copyMemory.returns(ExtTypes::void);
    copyMemory.arg(ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWord);

    copyMemory.call(_dest, _source, _size);
}
Старый 28.04.2006, 13:06   #3  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
У класса Binary есть метод Attach, он делает именно это. Действует по-моему так
Если в переменной A со смещением X находится указатель на переменную B, то нужно писать B.Attach(A.dword(X), sizeof(B))
Старый 28.04.2006, 13:16   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
X++:
Binary Bin, Bin1;
;
...
Bin1 = new Binary(4);
Bin1.Binary(0, Bin);
Bin1.dWord(0); // - адрес памяти объекта Bin
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: ivas (1).
Старый 28.04.2006, 13:28   #5  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от Lucky13
У класса Binary есть метод Attach, он делает именно это. Действует по-моему так
Если в переменной A со смещением X находится указатель на переменную B, то нужно писать B.Attach(A.dword(X), sizeof(B))
A.dword(X) - это не адрес памяти, а значение по смещению Х
Для attach первым аргументом идет адрес. Который нам нужно узнать. Увы %(
Старый 28.04.2006, 13:37   #6  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Однако! код
Код:
static void CHI_Job52(Args _args)
{
    Binary b1, b2;
    ;
    b1 = new Binary(4);
    b2 = new Binary(4);
    b1.attach(b2.dWord(0), 4);
    print b1.byte(1);
    pause;
}
на выводе print вешает наглухо аксапту. Люди, объясните, плз, _КАК_ может работать attach, если инструкция b2.dWord(0) возвращает значение, а не адрес??? Или где?
Старый 28.04.2006, 13:40   #7  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от ivas
Есть экземпляр класса Binary. Требуется получить его адрес и запихнуть в другой Binary
Здесь B - экземпляр объекта Binary
A - другой Binary, в смещении X лежит указатель, который должен указывать на B. Да, мы не узнали адреса B, но присвоили его в другой Binary. По-моему это и было нужно. Или я не прав?
Старый 28.04.2006, 13:43   #8  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от ivas
Однако! код
Код:
static void CHI_Job52(Args _args)
{
    Binary b1, b2;
    ;
    b1 = new Binary(4);
    b2 = new Binary(4);
    b1.attach(b2.dWord(0), 4);
    print b1.byte(1);
    pause;
}
на выводе print вешает наглухо аксапту. Люди, объясните, плз, _КАК_ может работать attach, если инструкция b2.dWord(0) возвращает значение, а не адрес??? Или где?
В данном случае мы получаем что b2 содержит указатель на b1, а не наоборот т.е. адрес b1 будет находиться в b2.dWord(0). Вот такое вот извращение
Старый 28.04.2006, 13:50   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 Lucky13
Attach() присваивает объекту Binary указатель на память, передаваемую в первом аргументе. A.dWord(X) - это не указатель на память, а значение, хранящееся в памяти по смещению X. Т.е. объект начинает ссылаться на неопределенное место в памяти, по-этому при пропытке обратиться туда возникает GPF
__________________
Axapta v.3.0 sp5 kr2
Старый 28.04.2006, 13:51   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas
Требуется получить его адрес и запихнуть в другой Binary.
Эк вас плющит...

X++ основан на java.
Java не содержит указателей (принцип у нее такой).
Если хотите понять как получить адрес в X++, то ищите ответ на ресурсах по java.
__________________
полезное на axForum, github, vk, coub.
Старый 28.04.2006, 13:52   #11  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от Lucky13
Здесь B - экземпляр объекта Binary
A - другой Binary, в смещении X лежит указатель, который должен указывать на B. Да, мы не узнали адреса B, но присвоили его в другой Binary. По-моему это и было нужно. Или я не прав?
Если перевести задачу на С++, требуется что-то вроде этого:
Код:
A a1();
A *pa = &a1;
т.е. каким-то образом получить системный адрес (DW) ячейки памяти....
Нужна обратная ситуация. Мы не знаем адреса В, нам нужно его получить и записать в А по некоторому смещению.
Старый 28.04.2006, 13:54   #12  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от mazzy
Эк вас плющит...

X++ основан на java.
Java не содержит указателей (принцип у нее такой).
Если хотите понять как получить адрес в X++, то ищите ответ на ресурсах по java.
Да, плющит... %)))) Еще со вчерашнего дня (см. форум). Создание интерфейса с InterBase напрямую через DLL (GDS32) ...
Старый 28.04.2006, 13:58   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
поищите например здесь
http://www.javaworld.com/isearch?qt=...id=1&st=1&rf=0

вам нужно определиться как работать со ссылками в джаве.
после этого вернетесь к аксапте
__________________
полезное на axForum, github, vk, coub.
Старый 28.04.2006, 13:58   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 ivas

Извините, но, по-моему, в дискуссии с Lucky13 вы пропустили ответ.
Используйте метод Binary.Binary()
__________________
Axapta v.3.0 sp5 kr2
Старый 28.04.2006, 14:02   #15  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от AndyD
2 ivas
Извините, но, по-моему, в дискуссии с Lucky13 вы пропустили ответ.
Используйте метод Binary.Binary()
Это вы извините. Действительно, какое-то страшное число, похожее на адрес записалось. Спасибо!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Можно ли получить объект формы dreamer DAX: Программирование 9 26.11.2007 17:58
Как из FormStringControl получить DictType Владимир Максимов DAX: Программирование 3 22.08.2007 17:09

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:51.