将字符串[]从C#发送到C ++ Dll'E_UNEXPECTED''SafeArrayAccessData()上的“灾难性错误”

时间:2018-01-22 08:41:36

标签: c# c++ dllimport

我有c#项目,我必须使用DllImport使用C ++ DLL。 (我有c ++ dll的源代码)

我正在从c ++ dll导入一个函数:

    [DllImport("Example.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int SendRequest(ref string[] fields);

我在c#中使用此功能,如下所示:

List<String> fields = new List<String>();
fields.Add("Test1");
fields.Add("Test2");
string[] fieldsArr = fields.ToArray();

int resultOfSendRequest = SendRequest(ref fieldsArr);

问题是c ++ dll上的SafeArrayAccessData函数返回'E_UNEXPECTED''灾难性错误'。

C ++代码是这样的:

__declspec( dllexport ) int _stdcall SendRequest  (SAFEARRAY**);

int _stdcall SendRequest ( SAFEARRAY** arrayFlds)

{   
    int res = 0;
char s[1024], Info[1024];
S_FLDS flds[MAX_FLDS];
HRESULT hRes;

// which language is using thr Dll ?
BYTE* pData; 
hRes = SafeArrayAccessData  (*arrayFlds, (void**)&pData);
BYTE bufLang [] = {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Language = (memcmp(bufLang, pData, sizeof(bufLang)) == 0) ? CALLER_VC : CALLER_VB;
hRes = SafeArrayUnaccessData(*arrayFlds);

//...

}

编辑:好的,我通过

解决了这个问题
 public static extern int SendRequest([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] ref string[] fields);

现在问题出现在c ++ dll中,它在某个地方将字符串转换为char *,它只读取第一个字符,而不是整个字符串。

1 个答案:

答案 0 :(得分:0)

编辑:好的,我通过使用:

解决了这个问题
public static extern int SendRequest([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] ref string[] fields);