MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Перегрузка операторов, необходимо иметь возможность извлечь реальный адрес локального поля"
Answer 785821
Перегрузка операторов тут не нужна. Нужен, вероятно,
pin_ptr
, в сочетании с PinnedGCHandle
(который позволяет предотвратить перемещение объекта сборщиком мусора). Для этого придется немного модифицировать класс:#include <stdlib.h> #include <stdio.h> typedef void* LPVOID ; using namespace System; using namespace System::Runtime::InteropServices; LPVOID get_native_ptr(){ return (LPVOID)& (L"Hello, C++/CLI world!\n"); } [StructLayout(LayoutKind::Sequential)] public ref class SomePtr { private: LPVOID m_hide_ptr_; GCHandle m_handle; public: SomePtr(): m_hide_ptr_(nullptr) { m_hide_ptr_ = get_native_ptr(); m_handle = GCHandle::Alloc(this,GCHandleType::Pinned);//закрепляем объект в памяти } IntPtr GetPtr() //получаем адрес m_hide_ptr_ { pin_ptr<LPVOID> p = &m_hide_ptr_; return (IntPtr)p; } //(добавить деструктор, освобождающий m_handle) }; int main(array<System::String ^> ^args) { SomePtr ^ foo = gcnew SomePtr(); LPVOID* bar= (LPVOID*)(LPVOID)foo->GetPtr();//указатель на m_hide_ptr_ wprintf(L"%s",*(bar));//тестируем чтение *bar = (LPVOID)& (L"Thanks, bye!\n");//тестируем запись wprintf(L"%s",*bar); system("PAUSE"); return 0; }
Не знаю, имеет ли какой-то смысл данный код, но он работает.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.