Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带输出参数的PInvoking函数 我有以下C++函数: int my_func(char* error) { // Have access here to an Exception object called `ex` strcpy(error, ex.what()); return 0; }_C#_C++_Pinvoke_Marshalling - Fatal编程技术网

C# 带输出参数的PInvoking函数 我有以下C++函数: int my_func(char* error) { // Have access here to an Exception object called `ex` strcpy(error, ex.what()); return 0; }

C# 带输出参数的PInvoking函数 我有以下C++函数: int my_func(char* error) { // Have access here to an Exception object called `ex` strcpy(error, ex.what()); return 0; },c#,c++,pinvoke,marshalling,C#,C++,Pinvoke,Marshalling,我在C#中是这样说的: 在代码中这样使用(当然总是C): 如果我运行这个程序,程序会崩溃得很厉害(这意味着程序会毫无例外地崩溃,只是关闭了,就这样)。我做错了什么?这里的问题是:您的代码如何知道字符串缓冲区应该有多大 通常你会有办法找到答案的。在没有这些信息的情况下,您唯一能做的就是在调用函数之前,将StringBuilder初始化为您期望的最大字符串 例如: StringBuilder error = new StringBuilder(1024); // Assumes 1024

我在C#中是这样说的:

在代码中这样使用(当然总是C):


如果我运行这个程序,程序会崩溃得很厉害(这意味着程序会毫无例外地崩溃,只是关闭了,就这样)。我做错了什么?

这里的问题是:您的代码如何知道字符串缓冲区应该有多大

通常你会有办法找到答案的。在没有这些信息的情况下,您唯一能做的就是在调用函数之前,将
StringBuilder
初始化为您期望的最大字符串

例如:

     StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max.

您的代码正在传递一个默认容量为(我认为)16的
StringBuilder
,因此任何大于该容量的字符串都会导致崩溃。

这里的问题是:您的代码如何知道字符串缓冲区应该有多大

通常你会有办法找到答案的。在没有这些信息的情况下,您唯一能做的就是在调用函数之前,将
StringBuilder
初始化为您期望的最大字符串

例如:

     StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max.

您的代码正在传递一个默认容量为(我认为)16的
StringBuilder
,因此任何大于该容量的字符串都会导致崩溃。

的答案似乎正确。但对于你的下一个问题:请至少告诉我们错误消息。“严重崩溃”并不像异常消息那样是一个很好的提示。没有异常,这就是问题所在。程序退出了,就这样…这个函数的接口被破坏了。您无法防止缓冲区溢出。您必须让调用者通过缓冲区的长度,然后确保您不会复制超过缓冲区末尾的内容。但对于你的下一个问题:请至少告诉我们错误消息。“严重崩溃”并不像异常消息那样是一个很好的提示。没有异常,这就是问题所在。程序退出了,就这样…这个函数的接口被破坏了。您无法防止缓冲区溢出。您必须让调用者传递缓冲区的长度,然后确保复制不会超出缓冲区的末尾。
     StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max.