0

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

4

0 回答 0