[問題] C++的Unicode字串被C#呼叫使用

作者: Stevenashh (YO!!!)   2019-05-01 13:00:37
開發平台(Platform): (Ex: Win10, Linux, ...)
Windows XP
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++ 2008
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
小弟平常只寫C# 但目前有一隻C++的API要使用
這一隻API假設是 HResult void ExampleAPI( *LPCOLESTR Answer);
說明書上是說編碼方式統一是Unicode (對編碼沒有說非常理解 只知道要用wchar_t)
預期是C#端利用P/Invoke呼叫一隻我自行建立的的C++函式,這隻函示會呼叫到所需的API
C++:
這邊是我自己寫的C++函式,做了一些事情後來呼叫那隻範例API
HResult void MyCPlusPlusFun( wchar_t* ReturnAnswer){
//...do Something....
// Start call API
LPCOLESTR temp;
HResult hr = ExampleAPI( &temp );
ReturnAnswer = temp;
return hr;
}
這邊temp成功取得字串L"happy" 也成功轉給ReturnAnswer(Debug mode確認內容)
C#:
string ReturnValue="";
int result = MyCPlusPlusFun( ReturnValue );
但程式跑完了之後,ReturnValue都是空值Orz
試過C#這邊用StringBuilder,也是一樣的問題
感覺問題是在c++端,但亂試過其他種字串儲存char*
也沒有用Orz
應該是對c++編碼這邊太不熟了 但時間上可能沒辦法讓我慢慢學C++
不曉得有沒有大大知道我錯誤的地方在哪
若是關於Unicode的敘述有什麼錯誤也希望不吝指正 感謝
餵入的資料(Input):
C#端:
string ReturnValue="" ;
預期的正確結果(Expected Output):
C#端:
string ReturnValue=L"happy";
錯誤結果(Wrong Output):
string ReturnValue="";
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
只有一點點,在上述內文中有提及就不重覆貼上影響閱讀
補充說明(Supplement):
希望C++或是有常在C#與C++中做呼叫的大大可以指證一下我的錯誤Orz
感謝!
作者: sarafciel (Cattuz)   2019-05-01 13:44:00
指正(O) 指證(X)我沒理解錯的話 你那個MyCPPFun的函式好像是吃C#的string當字串 但C++的指標根資料結構其實是unmanged的所以兩邊不互通 應該是要訂成int MyCPPFun(IntPtr)這種更正 int MyCPPFun(ref IntPtr)這種 然後++那邊的函式介面也多補一個&給他弄成指標的參考 你在C#那邊再把挖出來的IntPtr用Marshal的函式轉成C#的string才會對
作者: feeya (24 August 升格為鄉民)   2019-05-01 15:27:00
Google關鍵字 c# call c++ dll string
作者: firejox (Tangent)   2019-05-01 16:09:00
你的問題 跟 這篇#1SimaasT 是一樣的你需要reference
作者: firose (guest也是也是也是也是也)   2019-05-02 09:58:00
跟編碼無關,你只是在C++裡面把紙標指向別處,外面當然沒影響。同樣的事情你在C#作也是一樣,所以跟語言也無關。
作者: RishYang (Rish)   2019-05-06 06:06:00
Windows XP!!!!
作者: sarafciel (Cattuz)   2019-05-10 12:26:00
會自動回收 所以你要注意的是另一種情況就是++那邊有把C#丟給他的address存下來 然後C#做了回收 導致後面再去call c++時這個address的東西已經被釋放最後++那邊炸掉這種case

Links booklink

Contact Us: admin [ a t ] ucptt.com