Возьмите адрес управляемой структуры - PullRequest
1 голос
/ 25 октября 2010

(кодирую на C #)

Я хочу передать указатель на структуру через API. Скажем структура

 [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
      public struct PassThisStruct
        {
           public Int32 Param1;
           public Int32 Param2;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=13)]
           public Char[] OutputData;

        };

Теперь декларация API: -

unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr);

т.е. Я хочу передать указатель структуры на структуру.

Я создал делегат для этого API, а затем извлек адрес из DLL и сохранил его в указателе функций. Но когда я пытаюсь скомпилировать, он выдает ошибку при объявлении делегата , что «невозможно получить адрес, получить размер или объявить указатель на управляемое пространство».

Так как передать указатель? Я знаю, что могу использовать «ref», но этот API написан на C ++ и ему нужен структурный указатель. Если я использую ref, я не могу передать Null, и я также получаю сообщение об ошибке «AccessViolationException» (это еще одна большая проблема для меня!). Поэтому я бы использовал ref, только если смогу избавиться от AccessViolationException.

Еще один вопрос, могу ли я передать Null в этом случае ?? Если да, то как?

Привет!

1 Ответ

1 голос
/ 11 августа 2013

Я вижу, что вы используете постоянный массив символов.Поэтому я бы переписал эту структуру как:

  [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
  public unsafe struct PassThisStruct
    {
       public Int32 Param1;
       public Int32 Param2;
       public fixed char OutputData[3];
    };

1) Тогда я бы использовал IntPtr ptr = Marshal.StructureToPtr (...);

   unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr) would change to:
   public delegate Int32 MyAPI(Int16 Something, IntPtr StructPtr)

2) Я не пробовално я думаю, что вы могли бы сделать:

  unsafe void MyMethod()
  {
     PassThisStruct s = new PassThisStruct();
     PassThisStruct* sPtr = (PassThisStruct*)s;

     myAPI(12, sPtr);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...