Здравствуйте, 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