Boost logo

Boost Users :

From: alexmark (talamar.lands_at_[hidden])
Date: 2006-09-22 06:11:18


The problem is the class managed_external_buffer currently does not provide
public default c-tor and interface functions create(), open(), close().

I'm writing DLL, where I need a global object of type
managed_external_buffer. This object is "connected" to mapped view of paging
file within processing of DLL_PROCESS_ATTACH and disconnected at
DLL_PROCESS_DETACH like that:

HANDLE g_hfm;
LPVOID g_buf_base_addr;
managed_external_buffer g_buf;

BOOL APIENTRY DllMain(,,,. ULONG reason, ...)
{
    switch (reason) {
    case DLL_PROCESS_ATTACH:
        if (!Attach()) return FALSE;
        break;
    case DLL_PROCESS_DETACH:
        Detach();
        break;
    }
    return TRUE;
}

bool Attach ()
{
    ...
    g_hfm = CreateFileMapping(0xFFFFFFFF, ...); // use paging file
    g_buf_base_addr = MapViewOfFile(g_hfm, ...);
    g_buf.create(g_buf_base_addr, ...);
    ...
    MyObj* p = g_buf.construct(...);
    ...
}

void Detach ()
{
    ...
    g_buf.destroy_ptr(p);
    ...
    g_buf.close();
    UnmapViewOfFile(g_buf_base_addr);
    CloseHandle(g_hfm);
    ...
}

As a workaround, I wrote my own class "managed_user_buffer" derived from
boost::interprocess::detail::basic_managed_memory_impl and providing public
default c-tor and create()/open()/close() methods. I just made a copy of
managed_external_buffer.hpp and slightly modified the code.
But it's not so clear, why managed_external_buffer class itself exposes the
restricted interface?
I suppose the class would be more usable w/o the restrictions like that. Or
not?
Moreover, in boost::shmem::named_shared_object class this functionality was
available.
Thanks,
Alex.
 


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net