问题描述
C++DLL里的一个函数:HRESULTDSStream_EnumVideoCompressor(VideoCompressorInfo*pInfo,int*piVidCompNum)得到系统中安装的视频压缩算法的信息。pInfo:指向一片预先分配的VideoCompressorInfo结构。如果为NULL,piVidCompNum将得到系统中安装的视频压缩算法的数目。piVidCompNum:如果pInfo不为NULL,piVidCompNum表示pInfo中包含多少个VideoCompressorInfo结构。如果pInfo等于NULL,piVidCompNum返回系统中安装的视频压缩算法的数目。//-------------------------------------------------------------------typedefstructVIDEOCOMPRESSORINFO{charszName[256];DWORDdwHandle;}VideoCompressorInfo;//------------------------C#封装------------------------------------[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructVideoCompressorInfo{[MarshalAs(UnmanagedType.ByValArray,SizeConst=256)]publicStringBuilderszName;publicInt32dwHandle;}//------------------------------------------------[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(IntPtrpInfo,refintpiVidCompNum);//-----------------------------------------------调用代码:XNStream.VideoCompressorInfo[]pInfo;intnum=0;intResult=XNStream.DSStream_EnumVideoCompressor(IntPtr.Zero,refnum);if(Result==0&&num>0){for(inti=0;i<num;++i){pInfo[i].szName=newStringBuilder(256);}intsize=Marshal.SizeOf(typeof(XNStream.VideoCompressorInfo));IntPtrstructPtr=Marshal.AllocHGlobal(size*num);Result=XNStream.DSStream_EnumVideoCompressor(structPtr,refnum);if(Result==0){pInfo=newXNStream.VideoCompressorInfo[num];for(inti=0;i<num;++i)pInfo[i]=Marshal.PtrToStructure(structPtr+i*size,typeof(XNStream.VideoCompressorInfo));//出错点,第一个参数:运算符+无法应用于IntPtr和int类型的操作数Marshal.FreeHGlobal(structPtr);StringBuilders=newStringBuilder();for(inti=0;i<pInfo.Length;i++){s.Append(pInfo[i].szName.ToString()+"n");}MessageBox.Show(s.ToString());}}主要是不知道如何对结构体封装,得不到返回的多个值,请大家帮帮忙!谢谢
解决方案
解决方案二:
第一:函數這樣定義[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(VideoCompressorInfopInfo,outintpiVidCompNum);
解决方案三:
pInfo[i].szName=newStringBuilder(256);pInfo沒new哪里來的pInfo[i]?
解决方案四:
函數定義改下[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(VideoCompressorInfo[]pInfo,outintpiVidCompNum);
底下的代碼就更不知所謂,看不懂你想干什么了