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




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来操作字符串,所以其中很多的东西都需要认真的想一下,不能想当然的想如何,便如何。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值