我试图将一个指针从 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,这怎么可能?