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來操作字符串,所以其中很多的東西都需要認真的想一下,不能想當然的想如何,便如何。
非以小事而勿以為重,以之為鑒。
總結
以上是生活随笔為你收集整理的C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程要养成的好习惯
- 下一篇: C# 通过socket实现UDP 通信