0

我正在使用 AMD ADL 来枚举和操作连接到我的系统的显示器。我需要的必要功能之一是能够读取和解析显示 EDID。我能够解析 EDID 的字节数组表示,但是我无法获取 EDID。根据 ADL 文档,我定义了 ADLDisplayEDIDData 结构并导入了 ADL_Display_EdidData_Get 函数。但是,我的代码的任何执行都会导致 retvalue -3 的错误。此 retvalue 表示无效参数。

EDIDData 结构:

[StructLayout(LayoutKind.Sequential)]
internal struct ADLDisplayEDIDData
{
    internal int Size;
    internal int Flag;
    internal int EDIDSize;
    internal int BlockIndex;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
    internal byte[] EDIDData;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    internal int[] Reserved;
}

DLL 导入:

[DllImport(Atiadlxx_FileName)]
internal static extern int ADL_Display_EdidData_Get(int adapterIndex, int displayIndex, ref ADLDisplayEDIDData EDIDData);

我的声明有什么错误吗?有人对 ADL 和获取 EDID 信息有任何经验吗?

先感谢您。

4

1 回答 1

0

尝试这个:

[DllImport(Atiadlxx_FileName)]
internal static extern int ADL_Display_EdidData_Get(int adapterIndex, int displayIndex, [In, Out] ADLDisplayEDIDData[] EDIDData);

ADLDisplayEDIDData[] EDID = new ADLDisplayEDIDData[2];
NVGetMonitorEDIDs(0, EDID);

像这样将维度长度传递给 c++ 会很好:

[DllImport(Atiadlxx_FileName)]
internal static extern int ADL_Display_EdidData_Get(int adapterIndex, int displayIndex, [In, Out] ADLDisplayEDIDData[] EDIDData, int iLength);

ADLDisplayEDIDData[] EDID = new ADLDisplayEDIDData[2];
NVGetMonitorEDIDs(0, EDID, EDID.Length);
于 2014-02-10T21:17:05.500 回答