SetupVerifyInfFile - параметр неверен. Как использовать C# pinvoke - PullRequest
0 голосов
/ 22 января 2020

У меня проблема с вызовом / реализацией SetupVerifyInfFile .
Когда я вызываю функцию VerifyInfFile, я получаю исключение «Параметр неверен».

    [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool SetupVerifyInfFile(
        string FileName,
        IntPtr AltPlatformInfo,
        ref IntPtr InfSignerInfo);

    [StructLayout(LayoutKind.Sequential)]
    public struct SP_INF_SIGNER_INFO
    {
        public int CbSize;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string CatalogFile;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string DigitalSigner;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string DigitalSignerVersion;
    }

    public static void VerifyInfFile(string infPath)
    {
        SP_INF_SIGNER_INFO infSignerInfo = default;
        infSignerInfo.CbSize = Marshal.SizeOf(infSignerInfo);
        var infSignerPtr = Marshal.AllocHGlobal(infSignerInfo.CbSize);

        try
        {
            Marshal.StructureToPtr(infSignerInfo, infSignerPtr, false);
            if (!SetupVerifyInfFile(infPath, IntPtr.Zero, ref infSignerPtr))
                throw new Exception("Error calling SetupVerifyInfFile().", new 
                                     Win32Exception(Marshal.GetLastWin32Error()));
        }
        finally
        {
            Marshal.FreeHGlobal(infSignerPtr);
        }
    }

1 Ответ

3 голосов
/ 22 января 2020

Я вижу четыре очевидные ошибки:

  1. Третий параметр, который вы передаете как ref IntPtr InfSignerInfo. Ошибочно передавать это как ref. Как задокументировано, этот параметр является указателем на структуру. Поэтому вам нужно удалить ref.
  2. . Вы не указываете набор символов для SP_INF_SIGNER_INFO и поэтому получите набор символов по умолчанию, который является ANSI. Это не соответствует CharSet.Auto в объявлении вашей функции.
  3. Вы используете неправильное значение для CbSize. Вы указываете размер указателя, но вам необходимо указать размер структуры: Marshal.SizeOf(typeof(SP_INF_SIGNER_INFO)).
  4. Вы использовали неверное значение для MAX_PATH. Правильное значение 260, а не 256.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...