如何将结构从C#传递到在C#x2B中创建的ActiveX函数+;(MFC)
我有一个奇怪的问题: MFC结构是如何将结构从C#传递到在C#x2B中创建的ActiveX函数+;(MFC),c#,c++,mfc,activex,C#,C++,Mfc,Activex,我有一个奇怪的问题: MFC结构是 #define SENSOR_DESC_LEN 30 #define CAM_ID_LEN 20 typedef struct { unsigned int SensorType; char Desc[SENSOR_DESC_LEN]; unsigned int CommType; // USB or TCP - COMM_TYPE float FirmwareVersion; float
#define SENSOR_DESC_LEN 30
#define CAM_ID_LEN 20
typedef struct
{
unsigned int SensorType;
char Desc[SENSOR_DESC_LEN];
unsigned int CommType; // USB or TCP - COMM_TYPE
float FirmwareVersion;
float HardwareVersion;
int Width;
int Height;
int ActiveStartX;
int ActiveStartY;
char CameraID[CAM_ID_LEN];
unsigned int pCam;
char Color;
} CAMERA_CAP_API;
相应的C#结构为:
[StructLayout(LayoutKind.Sequential)]
public struct CAMERA_CAP_API
{
public uint SensorType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public byte[] Desc;
public uint CommType;
public float FirmwareVersion;
public float HardwareVersion;
public int Width;
public int Height;
public int ActiveStartX;
public int ActiveStartY;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] CameraID;
public uint pCam;
public sbyte Color;
} ;
它正确-我可以使用以下签名通过DLL传递此结构:
[System.Runtime.InteropServices.DllImport("Camelot.dll", EntryPoint = "CamGetCamCaps", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern int CamGetCamCaps(int nCamNum, ref CAMERA_CAP_API CameraCap);
问题出在ActiveX中。(MFC)
我将参数设置为变量。
它在C#侧显示为object。
但是,尝试将相同的结构传递给对象失败:
object c = new CAMERA_CAP_API();
Camera1.GetCamCaps(ref c); // Camera1 is the ActiveX control
我得到以下错误:
mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常
其他信息:值不在预期范围内
我也试过:
IntPtr ptr = Marshal.AllocCoTaskMem(200);
GetNativeVariantForObject...
- 没有成功
问题是什么?是不是
GetCamCaps()
接受两个参数,整数和结构引用,而只传递一个?根据您的代码片段,它看起来是这样的。GetCamCaps只接受1个参数(对象类型;MFC端的变量)。该函数将在ActiveX中调用CamGetCamCaps。除此之外,您传递的是C#对象而不是变量。在通过之前,您必须将对象转换为C#variant。查看Marshall.GetNativeVariantForObject
-您知道ActiveX控件需要哪种变量类型吗?您可以尝试将该参数包装到VariantRapper中,看看是否有帮助。我在Adam Nathan的书:.NET和COM:完整的互操作性指南的第297页中找到了一个解决方案。VariantRapper/GetNativeVariantForObject无法处理结构。解决方案要复杂得多。