28.04.2006, 12:53 | #1 |
Участник
|
Как получить указатель на объект?
Доброго времени суток!
Собствено, сабж. Есть экземпляр класса Binary. Требуется получить его адрес и запихнуть в другой Binary. Вот такое извращение. Не спрашивайте, зачем это надо )) |
|
28.04.2006, 13:05 | #2 |
Участник
|
Взято отсюда: Сохранение/восстановление буфера обмена
Код: 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 |
Участник
|
У класса Binary есть метод Attach, он делает именно это. Действует по-моему так
Если в переменной A со смещением X находится указатель на переменную B, то нужно писать B.Attach(A.dword(X), sizeof(B)) |
|
28.04.2006, 13:16 | #4 |
Участник
|
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 |
Участник
|
Цитата:
Сообщение от Lucky13
У класса Binary есть метод Attach, он делает именно это. Действует по-моему так
Если в переменной A со смещением X находится указатель на переменную B, то нужно писать B.Attach(A.dword(X), sizeof(B)) Для attach первым аргументом идет адрес. Который нам нужно узнать. Увы %( |
|
28.04.2006, 13:37 | #6 |
Участник
|
Однако! код
Код: 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; } |
|
28.04.2006, 13:40 | #7 |
Участник
|
Цитата:
Сообщение от ivas
Есть экземпляр класса Binary. Требуется получить его адрес и запихнуть в другой Binary
A - другой Binary, в смещении X лежит указатель, который должен указывать на B. Да, мы не узнали адреса B, но присвоили его в другой Binary. По-моему это и было нужно. Или я не прав? |
|
28.04.2006, 13:43 | #8 |
Участник
|
Цитата:
Сообщение от 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; } |
|
28.04.2006, 13:50 | #9 |
Участник
|
2 Lucky13
Attach() присваивает объекту Binary указатель на память, передаваемую в первом аргументе. A.dWord(X) - это не указатель на память, а значение, хранящееся в памяти по смещению X. Т.е. объект начинает ссылаться на неопределенное место в памяти, по-этому при пропытке обратиться туда возникает GPF
__________________
Axapta v.3.0 sp5 kr2 |
|
28.04.2006, 13:51 | #10 |
Участник
|
Цитата:
Сообщение от ivas
Требуется получить его адрес и запихнуть в другой Binary.
X++ основан на java. Java не содержит указателей (принцип у нее такой). Если хотите понять как получить адрес в X++, то ищите ответ на ресурсах по java. |
|
28.04.2006, 13:52 | #11 |
Участник
|
Цитата:
Сообщение от Lucky13
Здесь B - экземпляр объекта Binary
A - другой Binary, в смещении X лежит указатель, который должен указывать на B. Да, мы не узнали адреса B, но присвоили его в другой Binary. По-моему это и было нужно. Или я не прав? Код: A a1(); A *pa = &a1; Нужна обратная ситуация. Мы не знаем адреса В, нам нужно его получить и записать в А по некоторому смещению. |
|
28.04.2006, 13:54 | #12 |
Участник
|
Цитата:
Сообщение от mazzy
Эк вас плющит...
X++ основан на java. Java не содержит указателей (принцип у нее такой). Если хотите понять как получить адрес в X++, то ищите ответ на ресурсах по java. |
|
28.04.2006, 13:58 | #13 |
Участник
|
поищите например здесь
http://www.javaworld.com/isearch?qt=...id=1&st=1&rf=0 вам нужно определиться как работать со ссылками в джаве. после этого вернетесь к аксапте |
|
28.04.2006, 13:58 | #14 |
Участник
|
2 ivas
Извините, но, по-моему, в дискуссии с Lucky13 вы пропустили ответ. Используйте метод Binary.Binary()
__________________
Axapta v.3.0 sp5 kr2 |
|
28.04.2006, 14:02 | #15 |
Участник
|
Цитата:
Сообщение от AndyD
2 ivas
Извините, но, по-моему, в дискуссии с Lucky13 вы пропустили ответ. Используйте метод Binary.Binary() |
|