我有以下C ++函数(属于IUnknown派生的COM接口),我想从C#代码中调用该函数:
记录的C ++声明:
HRESULT Function1([in] STRUCT1 *s1, [in, out] STRUCT2 *s2, [in] SIZE_T var1);
在工作的C ++程序中的声明:
STDMETHOD(Function1)(
THIS_
__out STRUCT1 * s1,
__in_ecount_opt(var1) const STRUCT2 * s2,
SIZE_T var1
) PURE;
在C#领域中,我定义了以下内容:
[StructLayout(LayoutKind.Sequential)]
public struct STRUCT1
{
public uint member1; //HRESULT member1
public ulong member2; //SIZE_T member2
}
[StructLayout(LayoutKind.Sequential)]
public struct STRUCT2
{
public IntPtr member1; //VOID *member1;
public ulong member2; //SIZE_T member2;
public STRUCT3 member3; //STRUCT3 member3;
}
[StructLayout(LayoutKind.Sequential)]
public struct STRUCT3
{
public int member1; //int member1
}
我在C#中实现以下功能:
[ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("…")]
public interface Iinterface1
{
……
uint Function1(ref STRUCT1 s1, ref STRUCT2 s2, ulong var1);
……
}
我这样调用该函数:
STRUCT1 temp1 = new STRUCT1();
temp1.member1 = 0;
temp1.member2 = 0;
STRUCT2 temp2 = new STRUCT2();
STRUCT3 temp3 = new STRUCT3();
temp3.member1 = 0;
temp2.member1 = IntPtr.Zero;
temp2.member2 = 0;
temp2.member3 = temp3;
ulong var1 = 1;
res1 = COMobject.Function1(ref temp1, ref temp2, var1);
当执行函数时,我得到一个访问冲突异常:
“在prog1.exe中发生了'System.AccessViolationException类型的未处理异常”。附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。“
我实现了同一接口的大多数功能,并且在该应用程序中也实现了许多其他接口。这真的使我感到困惑。
非常感谢您的帮助。
先感谢您。
COM-Interop有一组相当奇怪的规则,您必须真正地“融入其中”才能对此进行推理。许多事情都可能“无声地”出问题,而您只需要找出困难的方法即可。在类似的情况下,以下是我尝试解决的问题:
尝试使用PowerShell中的COM接口。它提供了一个很好的“第二POV”,以查看问题是否出在您的C#代码中。同样,以这种方式进行测试通常会更容易,将各种数据推入。
做一些调试。使用MessageBox()技巧在C ++(成员)函数的开始处暂停C ++代码的执行,然后附加调试器并查看发生了什么。
上一点可能很耗时,有时一堆参数的printfs和其他状态可以帮助您了解正在发生的事情。与PowerShell结合使用时,您可以得到很多输入,并查看哪些原因导致问题以及哪种类型的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句