1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针

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

时间:2022-01-01 11:02:35

相关推荐

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。