1

I got following definition for a function in a c-based DLL (no source available):

uint MakeReference(MemBlock* ipReferenceMemBlock);

MemBlock is defined as:

typedef struct {
    HANDLE_TAG dTag;
    long dLength;
    BYTE* dpReference;
} MemBlock;

HANDLE_TAG is defined as:

typedef char HANDLE_TAG[10 + 1];

My take on this in a C# Wrapper Class is:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MemBlock
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
    public string dTag;
    public uint dLength;
    [MarshalAs(UnmanagedType.LPStr)]
    public string dpReference;
}



[DllImport("lib.dll", CharSet = CharSet.Ansi, EntryPoint = "MakeReference@24", CallingConvention = CallingConvention.StdCall)]
public static extern uint MakeReference(ref IntPtr pDDipMemBlock);

public static uint FAPIMakeReference(ref MemBlock ipMemBlock)
    {
        uint error = 0;
        IntPtr pDDipMemBlock = Marshal.AllocHGlobal(Marshal.SizeOf(ipMemBlock));
        try
        {
            Marshal.StructureToPtr(ipMemBlock, pDDipMemBlock, false);
            error = MakeReferenceEx(ref pDDipMemBlock);
            ipMemBlock = (MemBlock)Marshal.PtrToStructure(pDDipMemBlock, typeof(MemBlock));
        }
        finally
        {
            Marshal.FreeHGlobal(pDDipMemBlock);

        }
        return error;
    }

calling this with:

MemBlock refMemBlock = new MemBlock();
uint error = MakeReferenceEx(ref refMemBlock);

resulting in an Access Violation Expection

Sascha G
  • 21
  • 4
  • I have zero knowledge of C#, but a quick search gave the following link - may hopefully be of some use http://stackoverflow.com/questions/5664737/calling-c-dll-from-c-sharp – Toby Aug 09 '16 at 10:12

0 Answers0