C#向C++封送結(jié)構(gòu)體數(shù)組

C#向C++封送結(jié)構(gòu)體數(shù)組

ID:38251533

大?。?7.30 KB

頁(yè)數(shù):4頁(yè)

時(shí)間:2019-06-06

C#向C++封送結(jié)構(gòu)體數(shù)組_第1頁(yè)
C#向C++封送結(jié)構(gòu)體數(shù)組_第2頁(yè)
C#向C++封送結(jié)構(gòu)體數(shù)組_第3頁(yè)
C#向C++封送結(jié)構(gòu)體數(shù)組_第4頁(yè)
資源描述:

《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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。