首页 > 代码库 > 2015.3.5 VS2005调用VC6 dll 时结构参数的传递

2015.3.5 VS2005调用VC6 dll 时结构参数的传递

结构只能以地址方式进行传递,dll只能传递结构不能传递类

VS端:

 

[DllImport(@"D:\程序\VC程序\MfcDllspace\Debug\space.dll")]

private static extern bool PassStruct(IntPtr skintptr);

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]

 

public struct sngk //定义结构

{

   public double jin ;

   public double wei;

   public int gao;

   public sngk(double j,double w,int g) //VS结构可以包含带参数的构造函数,而VC可以包含不带参数的构造函数

   {

       jin = j;

       wei = w;

       gao = g;

    }

}

 

sngk sk = new sngk(50,60,10); //初始化结构

int size = Marshal.SizeOf(sk); //

ntPtr objPtr = Marshal.AllocHGlobal(size); //分配内存空间

Marshal.StructureToPtr(sk, objPtr, false);// 值写入分配的空间

PassStruct (objPtr); //将结构传入VC++dll端处理

sk = (sngk)Marshal.PtrToStructure(objPtr, typeof(sngk)); //重新取出处理后的值

Marshal.FreeHGlobal(objPtr);//释放内存空间

 

VC++ Dll端:

 

//#pragma pack(push,1) //这两句据说是为了统一字节大小占一位还是两位,目前去掉也没问题

struct sngk

{

    double jin;          

    double wei;

      int gao;

 

      sngk()

      {

           jin=0;

           wei=0;

           gao=0;

      }

};

//#pragma pack(pop)

 

extern "C" __declspec(dllexport) bool fetchInfos(sngk* sk) //只能定义结构指针 补充,也可用&

{

      sk->jin*=2;

      sk->wei*=2;

      sk->gao*=2;

      return true;

}

2015.3.5 VS2005调用VC6 dll 时结构参数的传递