COM中最标准的做法应该是
从C++处返回一个SAFEARRAY,元素类型是BSTR
c++代码:
#include <windows.h>
#include <oaidl.h>
#pragma comment(linker, "/export:GetStrArr=_GetStrArr@0")
extern "C" SAFEARRAY* APIENTRY GetStrArr()
{
SAFEARRAY* r;
SAFEARRAYBOUND b;
b.lLbound = 0;
b.cElements = 3;
r = SafeArrayCreate(VT_BSTR, 1, &b);
LONG i;
i = 0;
SafeArrayPutElement(r, &i, SysAllocString(L"aaaaa"));
i = 1;
SafeArrayPutElement(r, &i, SysAllocString(L"ababc"));
i = 2;
SafeArrayPutElement(r, &i, SysAllocString(L"cbcbc"));
return r;
}
C#代码
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("a.dll")]
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
extern static string[] GetStrArr();
static void Main(string[] args)
{
foreach(string s in GetStrArr())
Console.WriteLine(s);
}
}