C#调用C写的DLL,在C中的调用方法如下:(其中XUSTS,XTSBLOCK,ERRBLOCK为结构体,已定义)
#define MAXOCCS 10;
#define DTYPXTIM -5;
#define DTYPDUBL -6;
#define H21_GET_ACTUALS 2;
long id;
long fts[2] = { 0x241A0000, 0x24190000 };
short data_ts[2] = { DTYPXTIM, DTYPDUBL };
XTSBLOCK times[MAXOCCS];
double vals[MAXOCCS];
XUSTS keytimes[MAXOCCS];
short keylevels[MAXOCCS];
void *ptdatas[2] = { (void *)times, (void *)vals };
XUSTS xusts_old;
XUSTS xusts_new;
long occs_ok;
short fts_ok;
ERRBLOCK err;
RHIS21DATA ( H21_GET_ACTUALS, 0, 0, id, fts[0] + 1, &xusts_old,
&xusts_new, 2,fts, data_ts, (long)MAXOCCS, keylevels, keytimes,
ptdatas,&occs_ok,&fts_ok,&err);
其中里面ptdatas在C#里面应该怎么定义?以下是我的定义方式 //读历史值
[DllImport("infoplus21_api.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void RHIS21DATA(int mode,int step,int outSiders,int tagId,int propertyId,XUSTS startTime,XUSTS endTime,int numfts,int[] fts,int[] datatypes,int maxoccus,out int[] keylevels,out XUSTS[] keyTimes,out IntPtr[] ptdatas, out int occsok,out int ftsok,out ERRBLOCK errMsg);求助高手
#define MAXOCCS 10;
#define DTYPXTIM -5;
#define DTYPDUBL -6;
#define H21_GET_ACTUALS 2;
long id;
long fts[2] = { 0x241A0000, 0x24190000 };
short data_ts[2] = { DTYPXTIM, DTYPDUBL };
XTSBLOCK times[MAXOCCS];
double vals[MAXOCCS];
XUSTS keytimes[MAXOCCS];
short keylevels[MAXOCCS];
void *ptdatas[2] = { (void *)times, (void *)vals };
XUSTS xusts_old;
XUSTS xusts_new;
long occs_ok;
short fts_ok;
ERRBLOCK err;
RHIS21DATA ( H21_GET_ACTUALS, 0, 0, id, fts[0] + 1, &xusts_old,
&xusts_new, 2,fts, data_ts, (long)MAXOCCS, keylevels, keytimes,
ptdatas,&occs_ok,&fts_ok,&err);
其中里面ptdatas在C#里面应该怎么定义?以下是我的定义方式 //读历史值
[DllImport("infoplus21_api.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void RHIS21DATA(int mode,int step,int outSiders,int tagId,int propertyId,XUSTS startTime,XUSTS endTime,int numfts,int[] fts,int[] datatypes,int maxoccus,out int[] keylevels,out XUSTS[] keyTimes,out IntPtr[] ptdatas, out int occsok,out int ftsok,out ERRBLOCK errMsg);求助高手
解决方案 »
- 执行sql语句,不是反回的datatable和dataset吗,
- 图片拖动
- 有高人 给我弄个 字符串加密解密的代码吗? 前提是 C 和 C# 通用
- 我又来了,问下C#关于notifyIcon BalloonTip(托盘气球提示)
- 问一个关于模拟点击页面的问题。
- C#web开发的问题,为何只能在本地web matrix下运行,从explorer访问时出错,有合适的答案马上给分
- 请执教。。。有关数据库信任连接的问题??
- JavaScript返回值问题
- 如何读取Word里的信息
- 请 大神将C#这段代码翻译成Delphi 或者告知是什么意思!!谢谢各位大神了!!
- C#引用了EXCELCOM组件,为什么在USING EXCEL的时候提示找不到命名空间?
- 当一个事件完成后,怎样让另一个事件在5秒后执行
float[] vals = new float[MaxOcc];
XUSTS[] times = new XUSTS[MaxOcc];
IntPtr valsptr = Marshal.AllocHGlobal(Marshal.SizeOf(vals));
IntPtr timesptr = Marshal.AllocHGlobal(Marshal.SizeOf(times));
IntPtr[] point = new IntPtr[] {valsptr, timesptr};执行到红色部分就报错:
类型“System.Single[]”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。
{
XTSBLOCK[] times = new XTSBLOCK[10];
double[] values = new double[10];
//... GCHandle hTimes = GCHandle.Alloc(times, GCHandleType.Pinned);
GCHandle hValues = GCHandle.Alloc(values, GCHandleType.Pinned);
IntPtr[] ptdatas = { hTimes.AddrOfPinnedObject(), hValues.AddrOfPinnedObject() };
{
RHIS21DATA(..., ptdatas, ...);
}
hTimes.Free();
hValues.Free();
}
[DllImport(...)]
public static extern void RHIS21DATA(..., IntPtr[] ptdatas, ...);