Маршалинг массива BSTR
От: B_A_D Израиль  
Дата: 26.03.21 08:57
Оценка:
Есть DLL-ка, написанная на С++ Builder.
Из нее экспортируется функция и при вызове из С++ аппликации все работает

typedef BSTR          TStringArray[100];
typedef TStringArray *PStringArray;

typedef Single        TValueArray[100];
typedef TValueArray  *PValueArray;


typedef __stdcall bool GetData(BSTR JN, int &V, PStringArray &JS, PValueArray &JV, BSTR &ErrMsg);


  //вызов
  int                 V;
  PStringArray        JS;
  PValueArray         JV;
  BSTR JN   =SysAllocString(L"ABCD");

  GetData( JN, V,  JS, ОV, ErrMsg);


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

     [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        private delegate bool FGetData(string JN, ref int V,
            [In,Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 100,ArraySubType = UnmanagedType.BStr)] ref string[] JS,
            [In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst=100, ArraySubType = UnmanagedType.R4)] ref float[] JV,
             [ MarshalAs(UnmanagedType.BStr)]  ref string ErrMsg);

    //вызов
    string JN = "AA000110";
        string ErrMsg = "";
           
        int Ver = 0;
        string[] JS =  new string[100];
        float[] JN =  new float[100];


        GetData(JN,  ref V,  ref JS,  ref JV, ref ErrMsg);


валится при вызове из C# с ошибкой "AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

Доступа к исходникам DLL-ки нет.
В чем ошибка ?
bstr c#
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.