資源描述:
《C#向C++封送結(jié)構(gòu)體數(shù)組》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、C#向C++封送結(jié)構(gòu)體數(shù)組在使用第三方的非托管API時(shí),我們經(jīng)常會(huì)遇到參數(shù)為指針或指針的指針這種情況,一般我們會(huì)用IntPtr指向我們需要傳遞的參數(shù)地址;?但是當(dāng)遇到這種一個(gè)導(dǎo)出函數(shù)時(shí),我們?nèi)绾握_的使用IntPtr呢,extern"C"__declspec(dllexport)intGetClass(ClasspClass[50])?;?由于這種情況也經(jīng)??赡苡龅剑晕抑谱髁?個(gè)示例程序來(lái)演示下如何處理這種非托管函數(shù)的調(diào)用!?首先創(chuàng)建一個(gè)C++的DLL?設(shè)置一個(gè)如上的導(dǎo)出函數(shù)?1?#include??2?#include??3??4
2、?typedef?struct?Student?5?{?6?????char?name[20];?7?????int?age;?8?????double?scores[32];?9?}Student;10?11?typedef?struct?Class12?{13?????int?number;14?????Student?students[126];15?}Class;16?17?extern?"C"?__declspec(dllexport)?int?GetClass(Class?pClass[50])18?{19?????for(int?i=0;i<50;i++)20?
3、????{21?????????pClass[i].number=i;22?????????for(int?j=0;j<126;j++)23?????????{24?????????????memset(pClass[i].students[j].name,0,20);25?????????????sprintf(pClass[i].students[j].name,"name_%d_%d",i,j);26?????????????pClass[i].students[j].age=j%2==0?15:20;27?????????}28?????}29?????return?
4、0;30?}??上面DLL的導(dǎo)出函數(shù)要求傳遞的參數(shù)為它自定義的Class結(jié)構(gòu)體數(shù)組,那么我們?cè)贑#調(diào)用它時(shí)也要自定義對(duì)應(yīng)的結(jié)構(gòu)體了,我們可以定義為如下:?1??[StructLayout(LayoutKind.Sequential)]?2?????????struct?Student?3?????????{?4?????????????[MarshalAs(UnmanagedType.ByValTStr,SizeConst=20)]?5?????????????public?string?name;?6?????????????public?int?age;?7???????
5、??????[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]?8?????????????public?double[]?scores;?9?????????}10?????????[StructLayout(LayoutKind.Sequential)]11?????????struct?Class12?????????{13?????????????public?int?number;14?????????????[MarshalAs(UnmanagedType.ByValArray,SizeConst=126)]15?
6、????????????public?Student[]?students;16?17?????????}??需要注意的是,這2個(gè)結(jié)構(gòu)體中的數(shù)組大小一定要跟C++中的限定一樣大小哦,接下來(lái)如何使用這個(gè)API來(lái)正確的獲取數(shù)據(jù)呢,大多數(shù)人可能想到像這樣的處理方式Class?myclass?=?new?Class();????????????IntPtr?ptr=Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Class)));????????????GetClass(ptr);????????????Marshal.FreeHGlobal(p
7、tr);??沒(méi)錯(cuò),這樣的處理是沒(méi)問(wèn)題的,但是我們的API的參數(shù)是Class數(shù)組,這種處理方式只是傳遞一個(gè)Class結(jié)構(gòu)體參數(shù),所以這種方式在這里就不太合適了,!??那大家就想到先Class[]myclass?=?new?Class[MaxClass];然后在用Marshal.AllocHGlobal來(lái)獲取myclass數(shù)據(jù)的指針,?其實(shí)這樣也是錯(cuò)的,因?yàn)镃lass結(jié)構(gòu)中包含了,不能直接封送的Student結(jié)構(gòu),所以無(wú)論如何上面的想法是錯(cuò)誤的!?那要怎么辦呢,其實(shí)很簡(jiǎn)單,就是先分配一段非托管內(nèi)存,并調(diào)用A