[问题] 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