结构体指针作函数参数(C# 调用C++ 的DLL)

1、C++结构体定义:

  #pragma pack(1)
  struct Person
  {
      #define Count_favoriteNumbers 6
  
      int id;
  
      float favoriteNumbers[Count_favoriteNumbers];
  
  };
  #pragma pack()        // #pragma pack(1) end

  C++ 导出函数:

  #define DllExport extern "C" __declspec(dllexport)

  DllExport void __stdcall InitPersonInfo_DLL(Person* p_Person)
  {
      p_Person->id = 6;
  
      for (int i = 1; i <= Count_favoriteNumbers; i++)
      {
          p_Person->favoriteNumbers[i - 1] = 1.11 * i;
      }    
  }

2、C# 结构体定义:

  [StructLayout(LayoutKind.Sequential, Pack = 1)]
      public class Person
      {
          public const int Count_favoriteNumbers = 6;

  public int id;

  [MarshalAs(UnmanagedType.ByValArray, SizeConst = Count_favoriteNumbers, ArraySubType = UnmanagedType.U4)]
          public float[] favoriteNumbers = new float[Count_favoriteNumbers];  
      }

  C# 调用:

  public partial class MainWindow : Window
  {

    [DllImport("MFCLibrary_ExportFunction.dll", EntryPoint = "InitPersonInfo_DLL")]
          static extern unsafe void InitPersonInfo_DLL(byte* p_Person);
          public unsafe void InitPersonInfo(ref Person person)
          {
              byte[] structBytes = StructToBytes(person);
              fixed (byte* p_Person = &structBytes[0])
              {
                  InitPersonInfo_DLL(p_Person);

  person = (Person)BytesToStruct(structBytes, person.GetType());
              }

    public MainWindow()
          {
              InitializeComponent();

        Person zhangSan = new Person();
              InitPersonInfo(ref zhangSan);
          }

    #region // 结构体与 byte[] 互转

    // Struct 转换为 byte[]
          public static byte[] StructToBytes(object structure)
          {
              int size = Marshal.SizeOf(structure);
              IntPtr buffer = Marshal.AllocHGlobal(size);

  try
              {
                  Marshal.StructureToPtr(structure, buffer, false);
                  byte[] bytes = new byte[size];
                  Marshal.Copy(buffer, bytes, 0, size);

  return bytes;
              }
              finally
              {
                  Marshal.FreeHGlobal(buffer);
              }
          }

  // byte[] 转换为 Struct
          public static object BytesToStruct(byte[] bytes, Type strcutType)
          {
              int size = Marshal.SizeOf(strcutType);
              IntPtr buffer = Marshal.AllocHGlobal(size);

  try
              {
                  Marshal.Copy(bytes, 0, buffer, size);

  return Marshal.PtrToStructure(buffer, strcutType);
              }
              finally
              {
                  Marshal.FreeHGlobal(buffer);
              }
          }
          #endregion

  }

原文地址:https://www.cnblogs.com/dhqy/p/10192062.html

时间: 2024-11-09 00:59:14

结构体指针作函数参数(C# 调用C++ 的DLL)的相关文章

结构体,结构体指针作为函数参数的应用笔记

1. 结构体,结构体指针作为函数参数有何区别 #include <stdio.h> #include <string.h> struct animal { char name[30]; int num; }; //使用结构体作为参数 浪费内存 需要建立结构体 void change_struct(struct animal cat) { cat.num = 17; } //函数内部改变需要地址 所以需要指针保存 void change_point(struct animal *ca

用结构体指针作为函数参数

// //  main.cpp //  结构体指针作为形参 // //  Created by geek on 15/9/1. //  Copyright (c) 2015年 geek. All rights reserved. // #include <iostream> using namespace std; struct student{     int num;     char name[20];     float score; }; void print(student *p)

结构体指针做函数参数

1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 6 //定义一个结构体 7 //定义一个数据类型.固定内存大小的别名,还没有分配内存 8 /*struct Teacher 9 { 10 char name[5]; 11 int age; 12 };*/ 13 typedef struct Teacher 14 { 15 ch

语法*第九章*5 结构体指针作为函数参数

#include<stdio.h> struct student{ int num; char name[20]; float score; } stu={112301,"bowen1",20}; void print(struct student *p); int main(void){ print(&stu); } void print(struct student *p){ printf("%d %s %0.1f",p->num,p-

(struct)结构体变量作为函数参数调用的方法小结

结构体变量.结构指针变量.结构数组作为函数的参数应用实例分析 struct stud { long int num; float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) { t.num=2000101; t.score=71.0; } /*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/ void funar(struct stud t[]) //void funar(stru

指向结构体变量的指针作函数参数

 /********************* * 指向结构体变量的指针作函数参数 * ***********************/ #include<stdio.h> #include<string.h> struct student {  int num;  char name[20];  //char *name;    //若定义为指针则应与下面 stu.name = "jacob"; 配对使用,交叉使用则会报错                 //

[C++程序设计]用指向数组的指针作函数参数

1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 void output(int (*p)[4]); 7 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; 8 output(a); 9 return 0; 10 } 11 12 void output(int (*p)[4]) 13 { 14 int i,j; 15 for(i = 0; i < 3; i ++) 1

用指向函数的指针作函数参数

函数指针变量通常的用途之一,是把指针作为参数传递到其他函数. 调用函数指针的例子: int locateElem(LinearList *pL, ElemType e, int (*compare)(ElemType*, ElemType*)) 其中 compare 是函数指针名,(ElemType*, ElemType*)是函数指针的参数. 调用函数指针的例子: if ((*compare)(&e1, &e2) == 0) return i; 参数 &e1 和 &e2 是

不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,

产生野指针原因的本质:指针变量和它所指内存空间变量是两个不同的概念. 解决办法:三步曲 1.定义指针时,把指针变量赋值成NULL 2.释放内存时,先判断指针变量是否为NULL 3.释放完内存后,把指针变量重新复制成NUL #define  _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h> //你上面分配内存,总得给释放掉 二级指针法 int  getMem_f