vb.net调用C++写的DLL,提示"尝试读取或写入受保护的内存,通常指示其他内存已损坏",哪位大神指导一下! 5
l 原型:
l char * __stdcall GetCardInfo(char *personCode,char *servername)入参(共2个):
VB.net例子:
Public Declare Function GetCardInfo Lib " feitnccmclient.dll" (Byval personCode As string,Byval servername As string) As string
备注:stringbuilder已经试过! byte也试过,也分配足够空间了! 展开
改为
Public Declare Function GetCardInfo Lib " feitnccmclient.dll" (Byref personCode As string,Byref servername As string) As string
试试
我们开发语言是VB.NET,接口是C++封装的!你看有设么建议给我?
除了要把它互相调用的机制花店时间搞清楚以外,我也不知道有啥建议可以说。
然后你也没给我DLL,于是我就写个sample好了。
哦对了记得从里面返回指针到外面的时候,如果没有特别说明或者特别的处理方式,那么是用CoTaskMemAlloc来分配内存。不然你一个指针丢给VB,你觉得VB会怎么释放你这块内存……(我指的是那个return)
如果正好不巧你C++的DLL是静态链接到CRT的,然后又是malloc分配的内存返回回来,自己没保存一份就返回给VB,这情况……我只能说自求多福?因为谁也没办法释放它了,内存泄漏不可避。
另外StringBuilder在这里作参数的用法说实话我不熟悉它里面到底干了什么,不过我自己这里测试是可以运行。实际有什么风险可能要你自己去看看……
我自己平时用的是C#,对VB不熟。
补充:微软msdn杂志上有个文章有这么一句:
Always specify the capacity of StringBuilder in advance and make
sure the capacity is big enough to hold the buffer. The best practice on
the unmanaged code side is to accept the size of the string buffer as
an argument to avoid buffer overruns. In COM, you can also use size_is
in IDL to specify the size.
我传上去的代码没做这一步。你可能需要自己补上或者啥的