我试图将一个指针从c#传递给c ++,当我总是收到相同的地址时,即使我从c#发送一个NULL指针,这也会在c ++方面以意外结果结束。
一些细节。
注意:这是一个不同的问题。
C ++:
#pragma pack(push, 4)
struct CEA708CONFIG
{
BYTE b608Service;
BYTE bCompactStream;
BYTE pActiveServices[63];
LONG lActiveServiceCount; //
POINT ptAlignmentPosition; /
};
#pragma pack(pop)
interface
__declspec(uuid("{F1FAC4B6-5DAA-4875-B76B-8C10A0C0B22E}"))
ICEA708Decoder : IUnknown {
virtual HRESULT SetConfig(IN const CEA708CONFIG* pConfig) = 0;
virtual HRESULT GetConfig(OUT CEA708CONFIG* pConfig) = 0;
};
和c#部分:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public unsafe struct CEA708CONFIG
{
public byte is608Service;
public byte isCompactStream;
public fixed byte activeServices[63];
public int activeServiceCount;
public Point alignmentPosition;
};
[ComVisible(true), ComImport, Guid("F1FAC4B6-5DAA-4875-B76B-8C10A0C0B22E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICEA708Decoder
{
[PreserveSig]
int SetConfig([In] IntPtr config);
[PreserveSig]
int GetConfig([Out] out CEA708CONFIG config);
}
以及实际完成工作的代码:
int structSize = Marshal.SizeOf(cc708Config);
IntPtr structPtr = Marshal.AllocHGlobal(structSize);
Marshal.StructureToPtr(cc708Config, structPtr, false);
if (0 != (hr = CC708DecoderConfig.SetConfig(/*structPtr*/IntPtr.Zero)))
{
throw new ApplicationException("Couldn't SetConfig() because: " + DirectShowLib.DsError.GetErrorText(hr));
}
你可以看到我甚至试图发送IntPtr.Zero,它以c ++部分中的以下地址结束:0x0bb00058。
我的猜测是DS寄存器有问题,但不确定。
编辑:每当我进入SetConfig()的c ++部分时,我都可以看到'this''地址是0x0003,怎么可能?