C#调用C++ Dll 尝试读取或写入受保护的内存。这通常提示其他内存已损坏。
C++接口
// SKD接口
OPPO_STDCALL MES_SKD_GetLineList(__in char* pszKey1, __in char* pszData1, __in char* pszKey2, __in char* pszData2,
__in char* pszKey3, __in char* pszData3, __in char* pszKey4, __in char* pszData4,
__in char* pszKey5, __in char* pszData5, __in char* pszKey6, __in char* pszData6,
__in char* pszKey7, __in char* pszData7, __in char* pszKey8, __in char* pszData8,
__in char* pszKey9, __in char* pszData9, __in char* pszKey10, __in char* pszData10,
__inout int* pnDataCnt, __out char** ppszKey1List,
__out char** ppszData1List, __out char** ppszData2List,
__out char** ppszData3List, __out char** ppszData4List, __out char** ppszData5List,
__out char** ppszData6List, __out char** ppszData7List, __out char** ppszData8List,
__out char** ppszData9List, __out char** ppszData10List, __out char* pszErrMsg);
c#封装
[DllImport("OppoWebSerMesInterface.dll")]
public static extern int MES_SKD_GetLineList(string pszKey1, string pszData1, string pszKey2, string pszData2,
string pszKey3, string pszData3, string pszKey4, string pszData4,
string pszKey5, string pszData5, string pszKey6, string pszData6,
string pszKey7, string pszData7, string pszKey8, string pszData8,
string pszKey9, string pszData9, string pszKey10, string pszData10,
ref int pnDataCnt, ref StringBuilder ppszKey1List, ref StringBuilder ppszData1List, ref StringBuilder ppszData2List,
ref StringBuilder ppszData3List, ref StringBuilder ppszData4List, ref StringBuilder ppszData5List,
ref StringBuilder ppszData6List, ref StringBuilder ppszData7List, ref StringBuilder ppszData8List,
ref StringBuilder ppszData9List, ref StringBuilder ppszData10List, ref string pszErrMsg);
c#调用
int pnDataCnt = -1;
StringBuilder[] str = new StringBuilder[11];
string pszErrMsg = "";
int a = OppoMes.MES_SKD_GetLineList(null, null, null, "SKD", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
ref pnDataCnt, ref str[0], ref str[1], ref str[2], ref str[3], ref str[4], ref str[5],
ref str[6], ref str[7], ref str[8], ref str[9], ref str[10], ref pszErrMsg);
if (pnDataCnt <= 0)
{
return;
}
StringBuilder[] strPrintOrderList = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList1 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList2 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList3 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList4 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList5 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList6 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList7 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList8 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList9 = new StringBuilder[pnDataCnt];
StringBuilder[] strPrintOrderList10 = new StringBuilder[pnDataCnt];
for (int i = 0; i < pnDataCnt; i++)
{
strPrintOrderList[i] = new StringBuilder(3000);
strPrintOrderList1[i] = new StringBuilder(3000);
strPrintOrderList2[i] = new StringBuilder(3000);
strPrintOrderList3[i] = new StringBuilder(3000);
strPrintOrderList4[i] = new StringBuilder(3000);
strPrintOrderList5[i] = new StringBuilder(3000);
strPrintOrderList6[i] = new StringBuilder(3000);
strPrintOrderList7[i] = new StringBuilder(3000);
strPrintOrderList8[i] = new StringBuilder(3000);
strPrintOrderList9[i] = new StringBuilder(3000);
strPrintOrderList10[i] = new StringBuilder(3000);
}
a = OppoMes.MES_SKD_GetLineList(null, null, null, "SKD", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
ref pnDataCnt, ref strPrintOrderList[0], ref strPrintOrderList1[0], ref strPrintOrderList2[0], ref strPrintOrderList3[0], ref strPrintOrderList4[0], ref strPrintOrderList5[0],
ref strPrintOrderList6[0], ref strPrintOrderList7[0], ref strPrintOrderList8[0], ref strPrintOrderList9[0], ref strPrintOrderList10[0], ref pszErrMsg);
第一次调用的时候没有报错,第二次调用就报
尝试读取或写入受保护的内存。这通常提示其他内存已损坏
给我C++Dll的人给的C++调用范例
char szErrMsg[4096] = {0x00};
int nDataCnt = 0;
char** ppszKey1List = NULL;
char** ppszData1List = NULL;
char** ppszData2List = NULL;
char** ppszData3List = NULL;
char** ppszData4List = NULL;
char** ppszData5List = NULL;
char** ppszData6List = NULL;
char** ppszData7List = NULL;
char** ppszData8List = NULL;
char** ppszData9List = NULL;
char** ppszData10List = NULL;
MES_COM_LoginMesWithIp("172.16.166.7", "CAASY01", "SKD3005", "SKD1234");
MES_SKD_GetLineList(NULL, NULL, NULL, "SKD",
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
&nDataCnt, ppszKey1List,
ppszData1List, ppszData2List,
ppszData3List, ppszData4List, ppszData5List,
ppszData6List, ppszData7List, ppszData8List,
ppszData9List, ppszData10List, szErrMsg);
MES_COM_AssignMemory(&ppszKey1List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData1List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData2List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData3List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData4List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData5List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData6List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData7List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData8List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData9List, nDataCnt, 256);
MES_COM_AssignMemory(&ppszData10List, nDataCnt, 256);
MES_SKD_GetLineList(NULL, NULL, NULL, "SKD",
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
&nDataCnt, ppszKey1List,
ppszData1List, ppszData2List,
ppszData3List, ppszData4List, ppszData5List,
ppszData6List, ppszData7List, ppszData8List,
ppszData9List, ppszData10List, szErrMsg);
MES_COM_FreeMemory(&ppszKey1List, nDataCnt);
MES_COM_FreeMemory(&ppszData1List, nDataCnt);
MES_COM_FreeMemory(&ppszData2List, nDataCnt);
MES_COM_FreeMemory(&ppszData3List, nDataCnt);
MES_COM_FreeMemory(&ppszData4List, nDataCnt);
MES_COM_FreeMemory(&ppszData5List, nDataCnt);
MES_COM_FreeMemory(&ppszData6List, nDataCnt);
MES_COM_FreeMemory(&ppszData7List, nDataCnt);
MES_COM_FreeMemory(&ppszData8List, nDataCnt);
MES_COM_FreeMemory(&ppszData9List, nDataCnt);
MES_COM_FreeMemory(&ppszData10List, nDataCnt);