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来分配呢
C#调用C++Dll 结构体传值问题
答案:3 悬赏:60 手机版
解决时间 2021-02-17 23:57
- 提问者网友:了了无期
- 2021-02-17 14:09
最佳答案
- 五星知识达人网友:春色三分
- 2021-02-17 14:28
首先说明, 这绝对不是一个好的传递方式, 异构程序之间的数据传输 应该尽可能的以简单且文档化数据结构进行, 绝不应该依赖于语言特性或者平台特性。
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
public CAMERA_INFO_LIST[] stCameraInf;
----------------------------------------
unsafe 取CAMERA_INFO_LIST的地址
---------伪代码如下------------
unsafe{ CAMERA_INFO_LIST* ptr = &sct.stCameraInf;
正常遍历 .
.....................
}
----------------------------------------
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
public CAMERA_INFO_LIST[] stCameraInf;
----------------------------------------
unsafe 取CAMERA_INFO_LIST的地址
---------伪代码如下------------
unsafe{ CAMERA_INFO_LIST* ptr = &sct.stCameraInf;
正常遍历 .
.....................
}
----------------------------------------
全部回答
- 1楼网友:像个废品
- 2021-02-17 15:40
com说白了就是一个dll,clsid是这个dll的标识,clsid_cwmvencmediaobject2对应的dll应该是wmvdmoe2.dll,使用regsvr32.exe wmvdmoe2.dll,就可以注册(安装)这个dll。
如果你找不到这个dll,看看你是否在出问题的电脑上安装了directshow sdk以及wmv编码器,
也可以试试安装windows media player。
- 2楼网友:十鸦
- 2021-02-17 15:11
你两个结构体的内容肯定要一致呀,你在c++中用的是多少,肯定在c#中也应该是多少呀,这两个定义应该一致。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯