调用C++DLL时遇到结构体类型难题

xudaneng 2007-11-28 12:09:02
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());
}
}
主要是不知道如何对结构体封装,得不到返回的多个值,请大家帮帮忙!谢谢
...全文
113 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoshi10 2007-11-28
  • 打赏
  • 举报
回复
函數定義改下

[DllImport("DSStream.dll")]
public static extern int DSStream_EnumVideoCompressor(VideoCompressorInfo[] pInfo, out int piVidCompNum);


底下的代碼就更不知所謂,看不懂你想干什么了
laoshi10 2007-11-28
  • 打赏
  • 举报
回复
pInfo[i].szName = new StringBuilder(256);
pInfo沒new 哪里來的pInfo[i]?
laoshi10 2007-11-28
  • 打赏
  • 举报
回复
第一:
函數這樣定義
[DllImport("DSStream.dll")]   
public static extern int DSStream_EnumVideoCompressor(VideoCompressorInfo pInfo, out int piVidCompNum);

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧