请教大家一个棘手的问题,详情见贴内,谢谢。只有90分了,希望大家不要介意。
我们原先有段C++代码是用CLR封装的,因为我们是用C#调用的,用CLR封装调用起来也比较方便,但是经过长时间的测试,发现偶尔会有调用不成功的情况出现,就是C#这端显示执行到了DLL中要调用的函数,但是要调用的函数实际上没有执行,最后这个问题也没解决。现在只好乱试了,死马当活马医,把这段代码封装成纯C++的DLL,但是封装之后,用C#调用老提示无法加载 DLL“Test.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)。用C++调用,提示testC++dll.exe 中的 0x77b315de 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。为了找到问题,我把DLL的导出函数这样定义了,
#define DllExport extern "C" __declspec(dllexport)
DllExport int StopDll()
{
return 10;
}
没有用到其他CPP,但是依然提示如前所说,而且我发现,只要把这个DLL的导出函数导入了,无论调用代码有没有执行到DLL的导出函数,在main函数的第一行就这样提示,但是把其他CPP,H文件从DLL的工程中去掉,编译然后测试是成功的。还有C++测试代码报异常的地方是在这处
size_t __cdecl _msize_base (void * pblock)
{
size_t retval;
/* validation section */
_VALIDATE_RETURN(pblock != NULL, EINVAL, -1);
retval = (size_t)HeapSize(_crtheap, 0, pblock);
return retval;
}
请大家指教。谢谢了
只有90分了,希望大家不要介意。
[解决办法]
个人经验:跨语言调用最方便调试,最不容易出问题的方法是使用共享临时文本文件交换数据。
[解决办法]
是不是调用约定的问题?
尝试使用stdcall没?
[解决办法]
跨平台的时候,个人遇到的问题大部分是数据传递出错。
调试的时候建议输出关键数据,看看是否对吧。
还有一些是另一个平台不支持一些操作。
这个要具体看介绍了吧。
我只知道这些。
---
个人觉得跨平台的时候,错误处理就显得非常重要。
程序处理好了错误处理,跨平台的错误会比较好找。
不然累死!
[解决办法]
太可怜了。
我用 CLR,一直都没有问题。
多看看 PVInvoke。
[解决办法]
_VALIDATE_RETURN(pblock != NULL, EINVAL, -1);
这里出错?
如果是这里往回推一下,先看pblock 的值,继续往前推,看pblock 是怎么来的
具体怎么搞不好说,只能一步步调试找到源头。
另外你的函数指针类型声明注意调用约定一致不然也会出错。