日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2023/12/18 C# 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中函数返回字符串指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。