因项目需要,我要调用别人提供的dll,对方给的函数原型:
函数原型: function rdInfo_SSCID(t_SSCinfo: PSSCInfo): SmallInt;
数据结构: 
type TSSCInfo = record
      SSCID: array[0..69] of BYTE; 
end;
PSSCInfo = ^TSSCInfo;
看不懂是什么语言,找了一些资料自己写了个调用demo,总是不成功,我的代码如下:
声明代码:
[StructLayout(LayoutKind.Sequential)]
        public struct TSSCInfo
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
            public byte[] SSCID;
        }        [DllImport("szssc.dll")]
        static extern int rdInfo_SSCID(IntPtr Info);调用的代码:
                TSSCInfo info = new TSSCInfo();
                IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TSSCInfo)));
                Marshal.StructureToPtr(info, ptr, false);
                int rtnVal = rdInfo_SSCID(ptr);
                info = (TSSCInfo)Marshal.PtrToStructure(ptr, typeof(TSSCInfo));
                string val = System.Text.Encoding.Default.GetString(info.SSCID);
                Marshal.FreeHGlobal(ptr);
                MessageBox.Show("返回值:" + rtnVal.ToString() + "\t数据:" + val);dll放在程序同一个目录下的
请大虾们指教!很急。。

解决方案 »

  1.   

    是使用delphi编写的。IntPtr ptr = Marshal.AllocHGlobal(70);
      int rtnVal = rdInfo_SSCID(ptr);
      string val = Marshal.PtrToBStr(ptr);
      Marshal.FreeHGlobal(ptr);
      

  2.   

    我该成 PtrToStringBSTR了,出现了 Attemp to read or write protected memory 的错误
      

  3.   

    我的问题 在于rdInfo_SSCID(IntPtr Info)的返回值表示调用不成功,0是成功,返回总不是0,所以数据也就没有
    忘了说下,对方给的dll有很多个,因为我用C++的工具看了下,发现这个函数就在szssc.dll中所以就import这个
    其他的还有
    CTDRD10U.dll
    dcic32.dll
    GoldDes.dll
    hdssse32.dll
    SSSE32.dll
    SZSBCardProj1.ocx
    TY_SSSE32.dll
    那个ocx做什么用的?
      

  4.   

    OCX是一种控件,一般用在GUI编程中,应该和你没关系
    你用VC6的Depends工具再检查一下szssc.dll有否依赖于其它Dll,如果有,要一起拷到相关目录你的想法很好,神马都不管,先保证返回值正确再说或者先拿到VC下调用试试
      

  5.   

    [DllImport("szssc.dll")]
      static extern short rdInfo_SSCID(IntPtr Info);[StructLayout(LayoutKind.Sequential,Pack=4)]
      public struct TSSCInfo
      {
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
      public byte[] SSCID;
      }http://baike.baidu.com/view/3539221.htm
    SmallInt需要 2 个字节存储的整数http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.structlayoutattribute.pack.aspx
    另外默认情况下StructLayout属性Pack=4,可能 需要调整Pack的大小来决定TSSCInfo的占用空间
      

  6.   

    VC下不太懂...用depens看过,有一些依赖的dll,不过我一开始就都拷过去了,就是返回值是-1,根据对方给的错误列表是 “通讯错误”,很郁闷...
    我的代码是不是有出问题呢?