C :int  PubStrToIso ( char * pcSourceStr, int nStrLen,  ISODataStru * TargetIsoStru, int *pnPosition)  C#:
结构定义:         private delegate int FIELD_PACKAGER_PACK  (ISO_FIELD_DEF pthis, byte pfieldbuf, short fieldlen, byte poutdata);
        private delegate int FIELD_PACKAGER_UNPACK(ISO_FIELD_DEF pthis, byte pfieldbuf, short fieldlen, byte poutdata);
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        struct ISO_FIELD_DEF
        {
            short len;              /* 数据域最大长度 */
            LENGTH_TYPE lentype;    /* 数据域长度类型: 1--LLVAR型 2--LLLVAR型 */
            ALIGN_TYPE align;       /* 对齐类型 */
            char padchar;           /* 补齐字符 */
            FIELD_PACKAGER_PACK pack;       /* 打包函数指针 */
            FIELD_PACKAGER_UNPACK unpack;   /* 解包函数指针 */
        }; 
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        struct ISO_FIELD
        {
            short len;
            short off;              /* 指向iso->databuf缓冲区的偏移,数据中不含长度类型的几个字节 */
        }; 
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct ISODataStru
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
            ISO_FIELD []fld;
            char []bitmap; 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_MSG_LEN+MAX_MSG_LEN)]
            byte []databuf;     /* 多留一个域的长度,防止溢出 */
            short used;
        };
如何定义、使用 以上函数? ( PubStrToIso ) ?
万分感谢!

解决方案 »

  1.   

    目前调用方式:
    [DllImport("lib56X0.dll", EntryPoint = "PubStrToIso")]//, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
    public static extern int PubStrToIso(string[] pcSourceStr, int nStrLen, ISODataStru TargetIsoStru, int pnPosition);
    string[] pcSourceStr = { "08", "00", "00", "20", "00", "00", "00", "00", "00", "00", "01", "44", "66" };
    int nStrLen = 0, pnPosiotion = -1;
    ISODataStru TargetIsoStru = new ISODataStru()  ;
    nStrLen = 26;
    PubStrToIso(pcSourceStr, nStrLen, TargetIsoStru, pnPosiotion); 
    但报错???
      

  2.   

    报错的原因是楼主传入参数的类型不对。
    string[] pcSourceStr,这个参数有问题。char*在c#里面应该对应的int16的数据类型。楼主用string那肯定是不对的。具体情况请楼主搜索C C#数据类型对应。
      

  3.   

    DllImport("lib56X0.dll", EntryPoint = "PubStrToIso")]//, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] 
    public static extern int PubStrToIso(ref StringBuilder pcSourceStr, int nStrLen, ref ISODataStru TargetIsoStru, ref int pnPosition); *的换成引用类... char* 用 StringBuilder 看看
      

  4.   


    改成这样
    public static extern int PubStrToIso(IntPtr pcSourceStr, int nStrLen, IntPtr TargetIsoStru, ref int pnPosition); IntPtr pntStru = Marshal.AllocHGlobal(sizeof(ISODataStru));
    Marshal.StructureToPtr(TargetIsoStru, pntStru, false);IntPtr就相当于非托管内存中的指针。楼主用string[]往char *传有点奇怪了,string[]中有好多结束符,c那边只能认第一个"08"吧。
    实在传这些数据的话用string pcSourceStr = "08,00,..."形式比较好,c那边自己再根据逗号分割一下。
    调用时就这样PubStrToIso(Marshal.StringToHGlobalAnsi(pcSourceStr),nStrLen, pntStru, ref int pnPosition);