[程式] Unity scripting (native plugin)

楼主: riveranb (River)   2017-12-25 21:50:13
想请教 scripting 使用到 C++ native
plugin相关的问题
我想要从某个 native plugin中拿回处理过的字串内容
看过网络上的资讯知道应该用 StringBuilder
但因为我要重复这个呼叫过程
所以我想试着使用共用的 StringBuilder 物件
而不是每次都重新 new StringBuilder()
但这样的话在执行呼叫 native plugin API多次后(可能 20次以上)
我得到的 text内容就会有错误(比正确的要短少)
可是如果我每次呼叫 native plugin API都传入全新的物件 ( 透过 new
StringBuilder() )
我所得到的字串内容就会全部都正确
因为我是第一次做 unmanaged / managed code之间沟通的 programming
所以这部份我不太熟
不知道是过程中哪部分内存有出错
也很想要让 StringBuilder 物件可保持单一共用就好
也很想要让 StringBuilder 物件可保持单一共用就好
也很想要让 StringBuilder 物件可保持单一共用就好
也很想要让 StringBuilder 物件可保持单一共用就好
也很想要让 StringBuilder 物件可保持单一共用就好
以下是我的 sample codes
==== C++ native plugin部分 ====
extern "c" declspec(dllexport) void cppfunc( char * tostring, int maxlen)
{
std::string source = .... // get texts from opened file
if(source.length() < maxlen)
{
strcpy(tostring, source.c_str());
}
}
==== Unity C# script部分 ====
[DllImport ("CppPlugin")]
static extern void cppfunc(StringBuilder tostring, int maxlen);
......
{
{
StringBuilder thestring = new StringBuilder(_maxlen); // maxlen = 64
StringBuilder thestring = new StringBuilder(_maxlen); // maxlen = 64
while( /** if more in file **/ )
while( /** if more in file **/ )
{
#if METHOD1
thestring = new StringBuilder(_maxlen); // method 1, always correct
#else if METHOD2
thestring.Length = 0; // method 2, get wrong strings after several calls
#endif
CppInterop.cppfunc(thestring, _maxlen);
}
}
作者: cjcat2266 (CJ Cat)   2017-12-25 23:51:00
感觉是因为设Length的关系,切buffer长度,然后C++方又不知道被切了,最后最后只有写到C#方有效buffer长度,这样搞不好会危险?话说strcpy最后已经会加上’/0’不是?那这样就不用设Length也可以吧?我是没用过这种native沟通方式,我还有个疑问是C#会正确把StringBuilder的buffer位址传给C++的char*参数吗?还是其实应该要传个char[]才对?
楼主: riveranb (River)   2017-12-26 07:16:00
不好意思昨天没有把codes表示完整,已编辑过METHOD1和METHOD2 不会同时执行,但目的相同METHOD1 是每次都 new StringBuilder,这样每次拿到的字串都正确METHOD2 是重复使用StringBuilder,没次把之前内容清空但取回的字串内容会随执行次数变多而出错长度越来越短。比如:SamplesPerPixel => SamplesPer => Sample至于透过StringBuilder从 native DLL api 取回字串用法至于透过StringBuilder从 native DLL api 取回字串用法是网络上众多stackoverflow 大神教der,我自己也不熟熟https://goo.gl/okAMCi
作者: cjcat2266 (CJ Cat)   2017-12-26 07:39:00
我的意思是,把Length设成0的时候C#应该是有可能会把内部buffer切短,导致C++写超出buffer范围而造成错误strcpy本身已经有在字串尾端写上'\0'的行为,理论上不不需要在C#端另外碰Length写超出内部buffer范围,看来在你这特定的情况下没有造成程式当掉,但理论上是有可能当掉的

Links booklink

Contact Us: admin [ a t ] ucptt.com