C#调用C++ Dll 尝试读取或写入受保护的内存。这通常提示其他内存已损坏。

weixin_40991330 2017-12-12 07:47:44
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);
...全文
181 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
几罗星人 2017-12-12
  • 打赏
  • 举报
回复
我觉得吧,C#的string根C++的char*不一定是等价的,到底在C#声明的string能不能正确地按C++的要求也就是char*,也就是字符数组后面有'\0'的形式传送到C++ dll的代码都可能有问题。StringBuilder和char**也是。另外还有一个是调用约定的问题,就是参数传递顺序,谁(函数主调方还是函数内部)清理参数的问题,参见这个地址http://blog.csdn.net/aoshilang2249/article/details/39377643

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧