注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针  

2013-06-20 11:09:37|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针

在这个系列的“C#调用C++DLL的小总结6---C++Dll中指针的释放问题 ”中曾经详细说过类似的问题,但今天换了个马甲,就又耗费了半天的时间才解决掉,记下来以为咨询。

情况如下:

在一个C++DLL中写了一个函数用来返回数据库的连接字符串,返回值是一个char*的指针:

Char p[100] = {0};

Char * Getxxxx_con(xxx,xxx){return p;}

C#中为了偷懒,直接封装成了如下:

String Getxxxx_con(xxx,xxx){//此处调用封装的导出函数,直接返回即可}

这个在调试环境下没有问题,直接就可以用。因为工程完工后也没有立即使用,所以测试也没有多么重视。

直到昨天要去现场安装,才发现无法使用,一到调用这个函数,不是说无法加载DLL,就是程序就直接崩溃或者挂掉。

考虑有如下几种情况:

1、中英文环境的RUNTIME库不同引起不同的结果。以前发现过类似的问题。

2、缺少相应的DLL

第一种情况与第二种情况其实差不多。用一些看DLL的引用软件(如DEPENDS等),确实少几个库,增加后,还是崩溃。

而自己的电脑才装了WIN8_X64,编译出来的程序又无法在别的X32上的平台上使用,真是没办法了,只好在服务器上一点点的弄。

使用中文环境,安装中文库,都不能解决问题。晚上回家的路上同上文讲得一样,开始考虑这个DLL调用的问题,因为最新的库都是直接调用没有问题,所以仍然可能是这个DLL写得有问题.

早晨来了后把库的函数增加了一个,只返回INT型 ,测试成功,那么怀疑是全局的字符串指针失效。(也就是说DLL在加载后RETURN后被释放掉全局空间指针指向的内存无效,实际情况并不是如此)直接写了一个固定的字符串返回,报无法操作受保护的内存指针,这里才怀疑到了C#的封装层面上:

AttendServer.getDbConnectString(addr,port,name,pw);

注意:这个函数返回的是string

然后直接NEW了一个指针回传,也是报内存问题。

这时候儿才想起了在系列6中的现象:

Marshal.PtrToStringAnsi( AttendServer.getDbConnectString(addr,port,name,pw));

注意下面的函数返回值IntPtr

public static extern IntPtr getDbConnectString(string addr, int port, string name, string pw);

程序就OK了,本来想偷懒,结果反而更费时间。

欲速则不达啊。只是任谁都没想到,在调试时是可以的,到安装就不可以了,所以说还是对C#C++DLL的内存空间的操作不熟悉,没有深入到其内部。二者之间通过COM来操作字符串,所以其中很多的东西都需要认真的想一下,不能想当然的想如何,便如何。

非以小事而勿以为重,以之为鉴。

  评论这张
 
阅读(4589)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017