调用C++DLL时遇到结构体类型难题
C++DLL里的一个函数:
HRESULT DSStream_EnumVideoCompressor(VideoCompressorInfo * pInfo, int * piVidCompNum)
得到系统中安装的视频压缩算法的信息。
pInfo:
指向一片预先分配的VideoCompressorInfo结构。如果为 NULL,piVidCompNum 将得到系统中安装的视频压缩算法的数目。
piVidCompNum:
如果 pInfo 不为 NULL,piVidCompNum 表示 pInfo 中包含多少个 VideoCompressorInfo 结构。如果 pInfo 等于 NULL,piVidCompNum 返回系统中安装的视频压缩算法的数目。
//-------------------------------------------------------------------
typedef struct VIDEOCOMPRESSORINFO
{
char szName[256];
DWORD dwHandle;
} VideoCompressorInfo;
//------------------------C# 封装------------------------------------
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]
public struct VideoCompressorInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst =256)]
public StringBuilder szName;
public Int32 dwHandle;
}
//------------------------------------------------
[DllImport("DSStream.dll")]
public static extern int DSStream_EnumVideoCompressor(IntPtr pInfo, ref int piVidCompNum);
//-----------------------------------------------调用代码:
XNStream.VideoCompressorInfo[] pInfo;
int num=0;
int Result = XNStream.DSStream_EnumVideoCompressor(IntPtr.Zero, ref num);
if (Result == 0 && num > 0)
{
for (int i = 0; i < num; ++i)
{
pInfo[i].szName = new StringBuilder(256);
}
int size = Marshal.SizeOf(typeof(XNStream.VideoCompressorInfo));
IntPtr structPtr = Marshal.AllocHGlobal(size * num);
Result = XNStream.DSStream_EnumVideoCompressor(structPtr, ref num);
if (Result == 0)
{
pInfo = new XNStream.VideoCompressorInfo[num];
for (int i = 0; i < num; ++i)
pInfo[i] = Marshal.PtrToStructure(structPtr + i * size, typeof(XNStream.VideoCompressorInfo));//出错点,第一个参数:运算符+无法应用于IntPtr和int类型的操作数
Marshal.FreeHGlobal(structPtr);
StringBuilder s = new StringBuilder();
for (int i = 0; i < pInfo.Length; i++)
{
s.Append(pInfo[i].szName.ToString()+"\n");
}
MessageBox.Show(s.ToString());
}
}
主要是不知道如何对结构体封装,得不到返回的多个值,请大家帮帮忙!谢谢