Re: Маршалинг массива BSTR
От: _NN_  
Дата: 29.03.21 14:36
Оценка: 82 (3)
Здравствуйте, B_A_D, Вы писали:

Неясно зачем такой сложный тип.
Ссылка на указатель на массив.

У меня ваш код собирается и работает.
Пропущен у вас в коде: [return: MarshalAs(UnmanagedType.U1)]
Без этого маршаллер думает, что там тип BOOL, который будет 4 байта вместо одного.


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

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

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


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

    V = 10;

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

    (*JV)[0] = 10.10f;

    ErrMsg = SysAllocString(L"Err");

    return true;
}


using System;
using System.Runtime.InteropServices;

namespace ConsoleApp30
{
    class Program
    {
        [DllImport("Dll1", CallingConvention = CallingConvention.Winapi, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.U1)]
        public static extern bool FGetData(
            [MarshalAs(UnmanagedType.BStr)] 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);

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

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

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


abc
10
1010
0
Err
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.