作者riveranb (River)
看板GameDesign
标题[程式] Unity scripting (native plugin)
时间Mon Dec 25 21:50:13 2017
想请教 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);
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.40.34.73
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1514209817.A.F64.html
※ 编辑: riveranb (114.40.34.73), 12/25/2017 21:59:58
※ 编辑: riveranb (114.40.34.73), 12/25/2017 22:00:18
1F:推 cjcat2266: 感觉是因为设Length的关系,切buffer长度,然後C++方又12/25 23:51
2F:推 cjcat2266: 感觉是因为设Length的关系,切buffer长度,然後C++方又12/25 23:51
3F:→ cjcat2266: 不知道被切了,最後最後只有写到C#方有效buffer长度,12/25 23:51
4F:→ cjcat2266: 不知道被切了,最後最後只有写到C#方有效buffer长度,12/25 23:51
5F:→ cjcat2266: 这样搞不好会危险?话说strcpy最後已经会加上’/0’不12/25 23:51
6F:→ cjcat2266: 是?那这样就不用设Length也可以吧?我是没用过这种nat12/25 23:51
7F:→ cjcat2266: ive沟通方式,我还有个疑问是C#会正确把StringBuilder12/25 23:51
8F:→ cjcat2266: ive沟通方式,我还有个疑问是C#会正确把StringBuilder12/25 23:51
9F:→ cjcat2266: 的buffer位址传给C++的char*参数吗?还是其实应该要传12/25 23:51
10F:→ cjcat2266: 个char[]才对?12/25 23:51
~
※ 编辑: riveranb (42.77.58.61), 12/26/2017 07:14:29
※ 编辑: riveranb (42.77.58.61), 12/26/2017 07:15:02
11F:→ riveranb: 不好意思昨天没有把codes表示完整,已编辑过12/26 07:16
12F:→ riveranb: METHOD1和METHOD2 不会同时执行,但目的相同12/26 07:17
13F:→ riveranb: METHOD1 是每次都 new StringBuilder,这样每次拿到的12/26 07:18
14F:→ riveranb: 字串都正确12/26 07:18
15F:→ riveranb: METHOD2 是重覆使用StringBuilder,没次把之前内容清空12/26 07:19
16F:→ riveranb: 但取回的字串内容会随执行次数变多而出错12/26 07:20
17F:→ riveranb: 长度越来越短。比如:12/26 07:20
18F:→ riveranb: SamplesPerPixel => SamplesPer => Sample12/26 07:21
※ 编辑: riveranb (42.77.58.61), 12/26/2017 07:23:39
19F:→ riveranb: 至於透过StringBuilder从 native DLL api 取回字串用法12/26 07:26
20F:→ riveranb: 至於透过StringBuilder从 native DLL api 取回字串用法12/26 07:26
21F:→ riveranb: 是网路上众多stackoverflow 大神教der,我自己也不熟12/26 07:26
22F:→ riveranb: 熟12/26 07:26
※ 编辑: riveranb (42.77.58.61), 12/26/2017 07:28:16
24F:推 cjcat2266: 我的意思是,把Length设成0的时候C#应该是有可能会把 12/26 07:39
25F:→ cjcat2266: 内部buffer切短,导致C++写超出buffer范围而造成错误 12/26 07:39
26F:→ cjcat2266: strcpy本身已经有在字串尾端写上'\0'的行为,理论上不 12/26 07:40
27F:→ cjcat2266: 不需要在C#端另外碰Length 12/26 07:40
28F:→ cjcat2266: 写超出内部buffer范围,看来在你这特定的情况下没有造 12/26 07:41
29F:→ cjcat2266: 成程式当掉,但理论上是有可能当掉的 12/26 07:41