c#调用c++ sdk 调用函数参数为结构体指针

时间:2022-08-30 21:32:04
本人菜鸟一枚
SDK函数    LIBBVCU_API BVCU_Result BVCU_Initialize(  const BVCU_GlobalParam*  pParam); 

其中 BVCU_GlobalParam为结构体
typedef struct _BVCU_GlobalParam
{  
   int    iSize;
   void   (*OnEvent)(int iEventCode, void* pParam); 
   int    iReserved[4];
}BVCU_GlobalParam;

问题我是该直接传递一个指针,还是传一个BVCU_GlobalParam类型参数
public IntPtr m_bvcuSdkHandle;
BVCU_Initialize(ref Im_bvcuSdkHandle)(指针)
还是 BVCU_Initialize(ref _BVCU_GlobalParam bg) (结构体)

这两种都试了,接口返回还是参数不符合,请大神上码指教









1 个解决方案

#1


typedef struct _BVCU_GlobalParam
{  
   int    iSize;                                                               ----〉int
   void   (*OnEvent)(int iEventCode, void* pParam);  ----〉使用委托来对应函数指针
   int    iReserved[4];                                                   ----〉int[]    
}BVCU_GlobalParam;

DLLImport时,结构体对应需声明字符集,内存对齐方式等
例如:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]

如果要直接使用IntPtr,也不能只传个空指针进去
需要给指针分配合理的空间
看个示例:

struct devinfo
{
public string devID;  
public string devName;
   
//……
}
//调用
devinfo di = new devinfo();
di.devID = "KD0000299";
di.devName="myDevice";
 
GCHandle C_di = GCHandle.Alloc(di, GCHandleType.Pinned);
FireSDK_GetDeviceList(loginid,out C_di.AddrOfPinnedObject(),...); 
C_di.Free();


#1


typedef struct _BVCU_GlobalParam
{  
   int    iSize;                                                               ----〉int
   void   (*OnEvent)(int iEventCode, void* pParam);  ----〉使用委托来对应函数指针
   int    iReserved[4];                                                   ----〉int[]    
}BVCU_GlobalParam;

DLLImport时,结构体对应需声明字符集,内存对齐方式等
例如:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]

如果要直接使用IntPtr,也不能只传个空指针进去
需要给指针分配合理的空间
看个示例:

struct devinfo
{
public string devID;  
public string devName;
   
//……
}
//调用
devinfo di = new devinfo();
di.devID = "KD0000299";
di.devName="myDevice";
 
GCHandle C_di = GCHandle.Alloc(di, GCHandleType.Pinned);
FireSDK_GetDeviceList(loginid,out C_di.AddrOfPinnedObject(),...); 
C_di.Free();