gpt4 book ai didi

c++ - 尝试使用外部库中的方法时出现读取/写入访问错误

转载 作者:行者123 更新时间:2023-12-02 10:05:38 25 4
gpt4 key购买 nike

我正在尝试从库中使用以下实现

enter image description here

C++

int CALLBACK xCallback(long xmitlen, int buflen, char *buf, long flen)
{
return 0;
}

extern "C" __declspec(dllexport) int __stdcall TXFIlestransfer(int port, string fileName);

__declspec(dllexport) int __stdcall TXFIlestransfer(int port, string fileName)
{
int ret;

char *test = &fileName[0];

ret = sio_FtKermitTx(port, test, xCallback, 27);

return ret;
}

我正在导入此代码以与C#一起使用,并且正在获取System.AccessViolationException:'尝试读取或写入 protected 内存。这通常表明其他内存已损坏。

enter image description here

解决此错误的任何帮助将不胜感激。

最佳答案

我通过在C++ dll( Mydll.dll )中模拟sio_FtKermitTx函数来测试您的程序:

int sio_FtKermitTx (int port, char *fname, int (CALLBACK *func) (long xmitlen, int buflen, char *buf, long flen), int key)
{
return 5;
}

即使 body 是空的,我也有同样的问题。

经过多次调查,我发现问题出在我们在 stringC#代码之间使用 C++对象这一事实,出于某种原因(例如,unicode /多字节配置,或者仅仅是因为共享复杂对象难以实现)引起问题。

解决方案:
通过将 string对象替换为原始的 char类型,一切都会正常工作:

C#代码:
using System.Runtime.InteropServices;
namespace MyProgramme
{
class Test
{
// Import C++ DLL
[DllImport("Mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int TXFIlestransfer(int i, char[] filename);
//public static extern int TXFIlestransfer(int i, string filename); // this crash

static void RunTest(/*LoadFilterEVENTMessage msg*/)
{
string c = "ABC";
char[] char_arr = c.ToCharArray();
int i = TXFIlestransfer(3, char_arr);
// int i = TXFIlestransfer(3, c); string version crash

string s = i.ToString();
MessageBox.Show(s);
}

/* Methods in DLL being used below */
public static void Main()
{
RunTest();
}
};
}

C++ DLL代码(Mydll.dll):
extern "C" __declspec(dllexport) int TXFIlestransfer(int port, char fileName[])
{
int ret;
char *test = &fileName[0];
ret = sio_FtKermitTx(port, test, xCallback, 27);
return ret;
}

无论如何,您的 sio_FtKermitTx函数接受参数中的 char*,因此将 TXFIlestransfer参数从 string更改为 char[]没问题。

结果:
运行C#程序后,您将获得以下信息:

enter image description here

关于c++ - 尝试使用外部库中的方法时出现读取/写入访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com