PInvoking AddSecurityPackageA - PullRequest
       9

PInvoking AddSecurityPackageA

0 голосов
/ 12 февраля 2019

Я работаю над проектом, в котором мне нужно PInvoke для функции secur32!AddSecurityPackageA, но я все еще изучаю тонкости того, как сделать это вручную, и могу использовать некоторую помощь.

Вотссылки, с которыми я работаю:

И вот пример моего кода, в котором я пытаюсьопределите структуру и вызовите функцию:

[DllImport("secur32.dll", EntryPoint = "AddSecurityPackageA")]
  public static extern void AddSecurityPackageA(
  ref string pszPackageName,
  ref SECURITY_PACKAGE_OPTIONS[] Options
);

[StructLayout(LayoutKind.Sequential, CharSet =CharSet.Ansi)]
public class SECURITY_PACKAGE_OPTIONS
{
  public ulong Size;
  public ulong Type;
  public ulong Flags;
  public ulong SignatureSize;
  public IntPtr Signature;
}

string dll = @"c:\temp\test.dll";
SECURITY_PACKAGE_OPTIONS[] pkgOpts = new SECURITY_PACKAGE_OPTIONS();

AddSecurityPackageA(ref dll, ref pkgOpts);

Мои вопросы:

  1. В строках 3 и 4 это правильное использование ref, и это в целом правильнов соответствии с документами MSDN?
  2. В строке 14 структура C ++ в MSDN имеет это как пустой указатель, но при исследовании я обнаружил, что эквивалент C # - IntPtr.Это правильно, или мне нужно использовать unsafe?
  3. В общем, нашел ли кто-нибудь действительно хорошие уроки по PInvoke, кроме чтения кода других людей?Я перехожу из Python, так что он немного отличается, и я обнаружил, что «нарисуйте круг, нарисуйте остальную часть совы» или безумно длинную документацию MSDN, в которой делается много предположений.

Спасибо!

1 Ответ

0 голосов
/ 12 февраля 2019

Некоторые комментарии:

  1. Используйте функцию W вместо функции A.Вы не хотите ограничивать себя ANSI.Это мир Юникода.
  2. Функция имеет возвращаемое значение.Вы должны объявить функцию с соответствующим типом возвращаемого значения.Предположительно это uint или int, но вы должны проверить в заголовочном файле C ++.
  3. ref string неверно.Это должно быть string.
  4. ref SECURITY_PACKAGE_OPTIONS[] неправильно.Это не массив.Это указатель на struct.Поскольку вы объявили SECURITY_PACKAGE_OPTIONS как класс, ссылочный тип, вы можете заменить ref SECURITY_PACKAGE_OPTIONS[] на SECURITY_PACKAGE_OPTIONS.
  5. C ++ unsigned long - это 32 бита, поэтому он должен быть uint в C #.
  6. IntPtr правильно, но это оставляет нерешенным вопрос о том, как объявить цифровую подпись и получить указатель на нее.Я думаю, что нам не под силу этот вопрос, чтобы найти пример того, как это сделать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...