0

AMD ADL を使用して、システムに接続されたディスプレイを列挙および操作しています。私が必要とする機能の 1 つは、ディスプレイ EDID を読み取って解析する機能です。EDID のバイト配列表現を解析できますが、EDID を取得できません。ADL ドキュメントに基づいて、ADLDisplayEDIDData 構造体を定義し、ADL_Display_EdidData_Get 関数をインポートしました。ただし、私のコードを実行すると、retvalue -3 のエラーが発生します。この戻り値は、無効なパラメーターを示します。

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 に答える