永发信息网

C#调用C++Dll 结构体传值问题

答案:3  悬赏:60  手机版
解决时间 2021-02-17 23:57
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来分配呢
最佳答案
首先说明, 这绝对不是一个好的传递方式, 异构程序之间的数据传输 应该尽可能的以简单且文档化数据结构进行, 绝不应该依赖于语言特性或者平台特性。
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
public CAMERA_INFO_LIST[] stCameraInf;
----------------------------------------

unsafe 取CAMERA_INFO_LIST的地址

---------伪代码如下------------
unsafe{ CAMERA_INFO_LIST* ptr = &sct.stCameraInf;
正常遍历 .
.....................
}

----------------------------------------
全部回答
com说白了就是一个dll,clsid是这个dll的标识,clsid_cwmvencmediaobject2对应的dll应该是wmvdmoe2.dll,使用regsvr32.exe wmvdmoe2.dll,就可以注册(安装)这个dll。 如果你找不到这个dll,看看你是否在出问题的电脑上安装了directshow sdk以及wmv编码器, 也可以试试安装windows media player。
你两个结构体的内容肯定要一致呀,你在c++中用的是多少,肯定在c#中也应该是多少呀,这两个定义应该一致。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
洛城街道办事处我想知道这个在什么地方
河南省禹州市汽车站有去周口郸城的汽车吗?
无刺仙人掌的作用
总是不停的喝水好不好@@@@
贝尔康大药房(小南街店)地址在哪,我要去那里
网店进货过程中,同一价格区的商品,首先考虑
谁有高达00 Trans-Am 启动的声音 或者是 太阳
陕西工商职业学院 往年录取分数线
【五四运动时间】五四运动爆发的时间、地点是
微信可以加速不?
装水电拖把池花洒预留高度
火车K4065是广州哪个站
夏天狗狗 呕吐 不吃饭 没精神 鼻子干
寻求机械加工订单
肠胃消化不良能吃什么食物和不能吃什么食物?
推荐资讯
皮卡车侧方位停车,没有参照物怎么入库(没有
盖一栋楼二十层楼需要多少钱
MAY,M表示男生姓氏的首字母,Y表示you,A表
苏州北方人容易适应那里的气候吗??
男主带武器穿越到古代的小说
皇径坪在哪里啊,我有事要去这个地方
全空调的公共建筑,就全楼而言,其楼内的空气
A.O.史密斯地址有知道的么?有点事想过去
哪个技能可以提高鬼娃跟班被动和困者的触发
一七双数来二四猜一数字?在1-49中猜?
被拍卖公司骗了怎么办
到南宁火车K161准点率
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?