Question

I can DllImport common functions, but failed to import this kinds, below is DLL header files.

typedef struct
{
   VOID (* API_GetUID)(CHAR *pData, DWORD DataLen);

   DWORD (* API_GetChipType)();

} API_FUNCTION_STRUCT, *API_FUNCTION_STRUCT;

extern VOID WINAPI GetAPIObject(API_FUNCTION_STRUCT *pApiFunc);

I can't write the correct struct in C#.

public struct test
    {
        IntPtr  API_GetUID(IntPtr pData, int DataLen);
        IntPtr      API_GetChipType();
    } 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

Update:

public struct test
{
delegate void API_GetUID(IntPtr pData, int DataLen);
delegate void API_GetChipType();
}
Was it helpful?

Solution

You probably need to use the Marshal.GetDelegateForFunctionPointer function

This takes an IntPtr pointing to a native method and gives you back a delegate you can call.

public struct test
{
    IntPtr API_GetUID;
    IntPtr API_GetChipType;
} 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

delegate void GetUID_Delegate(IntPtr pData, uint dataLen);
delegate uint GetChipType_Delegate();

test a = new test();
GetAPIObject(ref a);

GetUID_Delegate getUID = Marshal.GetDelegateForFunctionPointer<GetUID_Delegate>(a.API_GetUID);
GetChipType_Delegate getChipType = Marshal.GetDelegateForFunctionPointer<GetChipType_Delegate>(a.API_GetChipType);

uint chipType = getChipType();

Edit

Alternatively use UnmanagedFunctionPointerAttribute.

public struct test
{
    GetUID_Delegate API_GetUID;
    GetChipType_Delegate API_GetChipType;

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate void GetUID_Delegate(IntPtr pData, uint dataLen);
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate uint GetChipType_Delegate();
} 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

test a = new test();
GetAPIObject(ref a);

uint chipType = a.API_GetChipType();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top