Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Перегрузка операторов, необходимо иметь возможность извлечь реальный адрес локального поля"

Answer 785821

Link

Перегрузка операторов тут не нужна. Нужен, вероятно, pin_ptr, в сочетании с Pinned GCHandle (который позволяет предотвратить перемещение объекта сборщиком мусора). Для этого придется немного модифицировать класс:

#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.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX