Re[2]: Маршалинг массива BSTR
От: B_A_D Израиль  
Дата: 08.04.21 14:18
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, B_A_D, Вы писали:


_NN>Неясно зачем такой сложный тип.


Библиотека сторонняя *.bpl, собрана то ли на с++ Builder или на Delfy.


_NN>Ссылка на указатель на массив.


_NN>У меня ваш код собирается и работает.

_NN>Пропущен у вас в коде: [return: MarshalAs(UnmanagedType.U1)]

Да, спасибо, дело было в неправильном маршаллинге BOOL.


_NN>Без этого маршаллер думает, что там тип BOOL, который будет 4 байта вместо одного.


_NN>

_NN>#include <windows.h>
_NN>#include <combaseapi.h>
_NN>#include <cwchar>

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

_NN>typedef float        TValueArray[100];
_NN>typedef TValueArray* PValueArray;


_NN>extern "C" __declspec(dllexport) bool __stdcall FGetData(BSTR JN, int& V, PStringArray& JS, PValueArray& JV, BSTR& ErrMsg)
_NN>{
_NN>    wprintf(L"%s\n", JN);

_NN>    V = 10;

_NN>    (*JS)[0] = SysAllocString(L"1010");

_NN>    (*JV)[0] = 10.10f;

_NN>    ErrMsg = SysAllocString(L"Err");

_NN>    return true;
_NN>}
_NN>


_NN>
_NN>using System;
_NN>using System.Runtime.InteropServices;

_NN>namespace ConsoleApp30
_NN>{
_NN>    class Program
_NN>    {
_NN>        [DllImport("Dll1", CallingConvention = CallingConvention.Winapi, ExactSpelling = true)]
_NN>        [return: MarshalAs(UnmanagedType.U1)]
_NN>        public static extern bool FGetData(
_NN>            [MarshalAs(UnmanagedType.BStr)] string JN,
_NN>            ref int V,
_NN>            [In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 100, ArraySubType = UnmanagedType.BStr)] ref string[] JS,
_NN>            [In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 100, ArraySubType = UnmanagedType.R4)] ref float[] JV,
_NN>            [MarshalAs(UnmanagedType.BStr)] ref string ErrMsg);

_NN>        static void Main(string[] args)
_NN>        {
_NN>            int v = 0;
_NN>            string[] js = new string[100];
_NN>            float[] jv = new float[100];
_NN>            string errmsg = null;

_NN>            FGetData("abc", ref v, ref js, ref jv, ref errmsg);

_NN>            Console.WriteLine(v);
_NN>            Console.WriteLine(js[0]);
_NN>            Console.WriteLine(jv[1]);
_NN>            Console.WriteLine(errmsg);
_NN>        }
_NN>    }
_NN>}
_NN>


_NN>
_NN>abc
_NN>10
_NN>1010
_NN>0
_NN>Err
_NN>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.