Interop: Returning a pointer from C#

Discussion in 'C#' started by daleh@hill-eng.com, Sep 2, 2010.

  1. daleh@hill-eng.com

    daleh@hill-eng.com New Member

    Joined:
    Sep 2, 2010
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    All,

    My question is:
    Is it possible to return a pointer allocated in managed code to unmanged code.


    I have an unmanged C++ application that calls into a C# dll. The C# dll is build as a CCW and the unmanaged app is build with /clr. I would like to have the unmanaged app be able to get an unmanaged pointer from the C# dll and then read its content. The problem I am running into is that the pointer gets moved so that the unmanged code asserts.

    I've seen articles referring to GCHandle but I can't figure out how to call it. Does the managed code call get the handle or the unmanaged code?


    A sample of the code is below.

    Any help on this would be greatly appreciated.

    TIA,
    Dale

    Code:
    // Unmanaged application
    int _tmain(int argc, _TCHAR* argv[])
    {
          // Get a pointer to the CCW Object
         GBVssNetInterface::_GBVssDeviceComm *pNetInterface;
         CoInitialize(NULL);
    
         GBVssNetInterface::_GBVssDeviceCommPtr p(__uuidof   (GBVssNetInterface::GBVssDeviceComm));
         pNetInterface = p;
    
         __int64 pLuns;
         pNetInterface->GetAllVisableLuns(&size, (LONG*)&pLuns);
    
         // Blows up
         GlobalFree((HGLOBAL)pLuns);
         return 0;
    }
    
    
    // Managed object
    namespace GBVssNetInterface
    {
        [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
        [ComVisible(true)] 
        [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface _GBVssDeviceComm
        {
            [DispId(1)]
            //unsafe int GetAllVisableLuns(int* size, char* pLunBuffer);
            unsafe int GetAllVisableLuns(ref int size, ref Int64 pLunBuffer);
        }
     
        [Guid("4CB08BDA-7F12-458a-AE0B-B6C4E4441822")]
        [ComVisible(true)] 
        [ClassInterface(ClassInterfaceType.None)]
        [ProgId("GBVssNetInterface.GBVssDeviceComm")]
        public class GBVssDeviceComm : _GBVssDeviceComm
        {
            public GBVssDeviceComm() {}
    
            public unsafe int GetAllVisableLuns(ref int Size, ref Int64 pLunBuffer)
            {
                IntPtr lunBuffer = Marshal.AllocHGlobal(size);
                pLunBuffer = lunBuffer.ToInt64();
                return 0;
            }
        }
    }
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice