c# 调用c++DLL 结构体参数传值的问题

wgyathuawei 2013-08-19 11:11:22
c++ DLL 函数原型:int SDK_GetDeviceList(CAMERA_INFO* pDeviceList);
c++ 结构体:CAMERA_INFO定义:
typedef struct
{
unsigned int uiTotal; //总记录数
CAMERA_INFO_LIST stCameraInf[1]; //结构体数组初始化长度为1,遍历uiTotal来取值,
//pDeviceList->stCameraInfo[index].CameraName
}CAMERA_INFO;

typedef struct
{
string CameraID;
string CameraName;
}CAMERA_INFO_LIST

C# 声明函数:
[DllImport(@"SDK.dll", CallingConvention = CallingConvention.StdCall)]
extern static int SDK_GetDeviceList(ref CAMERA_INFO);

c# 结构体定义
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO
{
public uint uiTotal;// 总记录数
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]
public CAMERA_INFO_LIST[] stCameraInf;
};

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO_LIST
{
string CameraID;
string CameraName;
};

c#调用C++Dll:
CAMERA_INFO info = new CAMERA_INFO();
int result = SDK_GetDeviceList(ref info);

这样调用能够取到值, [MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]中SizeConst必须赋值,
问题是在调用之前不知道返回CAMERA_INFO_LIST数组长度是多少,使用时只能赋一个很大的数值;想问下有
没有什么方法,SizeConst不赋初始值,根据uiTotal来分配呢
...全文
201 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
soaringbird 2013-08-19
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        unsafe struct CAMERA_INFO
        {
            public uint uiTotal;// 总记录数
            public CAMERA_INFO_LIST* stCameraInf;
        };

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        unsafe struct CAMERA_INFO_LIST
        {
            public fixed byte _CameraID[100];
            public string CameraID
            {
                get
                {
                    fixed (byte* p = _CameraID)
                    {
                        return Marshal.PtrToStringAuto(new IntPtr(p));
                    }
                }
            }
            public fixed byte _CameraName[100];
            //get
        };

        [DllImport(@"SDK.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SDK_GetDeviceList(CAMERA_INFO* pcInfo);
wgyathuawei 2013-08-19
  • 打赏
  • 举报
回复
引用 3 楼 soaringbird 的回复:
把你C++原型和调用代码都贴出来
C++原型 c++ DLL 函数原型:int SDK_GetDeviceList(CAMERA_INFO* pDeviceList); c++ 结构体:CAMERA_INFO定义: typedef struct { unsigned int uiTotal; //总记录数 CAMERA_INFO_LIST stCameraInf[1]; //结构体数组初始化长度为1,遍历uiTotal来取值, //pDeviceList->stCameraInfo[index].CameraName }CAMERA_INFO; typedef struct { string CameraID; string CameraName; }CAMERA_INFO_LIST
wgyathuawei 2013-08-19
  • 打赏
  • 举报
回复
引用 2 楼 soaringbird 的回复:
typedef struct { string CameraID; string CameraName; }CAMERA_INFO_LIST C++代码里这个真的是string吗?
-----谢谢关注 不是,是char CameraID[100],CameraName[100];我为了简单写成这样了,这个不会影响我问题问题
soaringbird 2013-08-19
  • 打赏
  • 举报
回复
把你C++原型和调用代码都贴出来
soaringbird 2013-08-19
  • 打赏
  • 举报
回复
typedef struct { string CameraID; string CameraName; }CAMERA_INFO_LIST C++代码里这个真的是string吗?
Trent1985 2013-08-19
  • 打赏
  • 举报
回复
用回调试一下!

110,533

社区成员

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

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

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