vb.net调用C++写的DLL,提示"尝试读取或写入受保护的内存,通常指示其他内存已损坏",哪位大神指导一下! 5

C++例子:l原型:lchar*__stdcallGetCardInfo(char*personCode,char*servername)入参(共2个):VB.net例子... C ++例子:
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也试过,也分配足够空间了!
展开
 我来答
人生做回自己
2014-12-31 · TA获得超过423个赞
知道小有建树答主
回答量:722
采纳率:100%
帮助的人:518万
展开全部
Public Declare Function GetCardInfo Lib " feitnccmclient.dll" (Byval personCode As string,Byval servername As string) As string
改为
Public Declare Function GetCardInfo Lib " feitnccmclient.dll" (Byref personCode As string,Byref servername As string) As string
试试
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
空雪梦见
2014-12-30 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1203万
展开全部
你到底干啥了……我觉得把DLL传上来会比较好一点,方便测试
追问
我们开发语言是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.

我传上去的代码没做这一步。你可能需要自己补上或者啥的

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式