我有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 *,它只读取第一个字符,而不是整个字符串。
答案 0 :(得分:0)
编辑:好的,我通过使用:
解决了这个问题public static extern int SendRequest([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] ref string[] fields);