Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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
将可写StringBuilder数组传递给C++;来自C# 我使用了一些非托管C++动态库和C+GUI应用程序。我需要把已知大小的字符串数组传递给C++库,这会填充它。还有最大字符串长度值。我正试图通过StringBuilder数组来传递具有适当大小和适当内部元素容量(也称为缓冲区数组)的内容 /C++库部分 #定义最大字符串长度200 const wchar_t*stringToPopulate=L“你好,世界”; MYDLL\u API uint8\u t\u stdcall GetSomeString(wchar\u t**strings,uint64\u t count){ 用于(自动i=0;i_C#_C++_Marshalling - Fatal编程技术网

将可写StringBuilder数组传递给C++;来自C# 我使用了一些非托管C++动态库和C+GUI应用程序。我需要把已知大小的字符串数组传递给C++库,这会填充它。还有最大字符串长度值。我正试图通过StringBuilder数组来传递具有适当大小和适当内部元素容量(也称为缓冲区数组)的内容 /C++库部分 #定义最大字符串长度200 const wchar_t*stringToPopulate=L“你好,世界”; MYDLL\u API uint8\u t\u stdcall GetSomeString(wchar\u t**strings,uint64\u t count){ 用于(自动i=0;i

将可写StringBuilder数组传递给C++;来自C# 我使用了一些非托管C++动态库和C+GUI应用程序。我需要把已知大小的字符串数组传递给C++库,这会填充它。还有最大字符串长度值。我正试图通过StringBuilder数组来传递具有适当大小和适当内部元素容量(也称为缓冲区数组)的内容 /C++库部分 #定义最大字符串长度200 const wchar_t*stringToPopulate=L“你好,世界”; MYDLL\u API uint8\u t\u stdcall GetSomeString(wchar\u t**strings,uint64\u t count){ 用于(自动i=0;i,c#,c++,marshalling,C#,C++,Marshalling,我在库API调用中遇到了System.AccessViolationException异常。这类问题的原因是什么 [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] 这是胡说八道,大小由参数1给出,而不是0。只要完全移除它,pinvoke marshaller就不需要任何帮助来计算数组的长度。它已经知道,它使用数组的Length属性 wcsncpy(*(providers + i), stringToPopulate,

我在库API调用中遇到了
System.AccessViolationException
异常。这类问题的原因是什么

   [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
这是胡说八道,大小由参数1给出,而不是0。只要完全移除它,pinvoke marshaller就不需要任何帮助来计算数组的长度。它已经知道,它使用数组的Length属性

    wcsncpy(*(providers + i), stringToPopulate,
            min(wcslen(stringToPopulate), MAX_STRING_LENGTH ));
wcsncpy是一个邪恶的,邪恶的功能。您通常会收到Microsoft C/C++编译器对此的强烈反对,并警告您这是不安全的。不要忽视这样的警告。它通过执行不可想象的操作来解决“字符串不适合”问题,它不会零终止字符串。当这种情况发生时,调用者总是会出现故障,毫无希望地在字符串末尾出错。AVE是(几乎)不可避免的,如果它没有读垃圾。你使用它的方式,这将永远发生

这可能是为了使函数安全,但却实现了相反的效果。核心问题是调用方无法指定字符串缓冲区的大小。因此,您应该重写它,以便它可以指定该大小。例如:

 MYDLL_API int __stdcall getOneString(int index, wchar_t* buffer, size_t bufferLength)
现在它很简单而且总是安全的,客户端代码只是重复调用它,增加索引参数。它不必猜测需要通过多大的数组。而且您的C代码不必猜测缓冲区有多大。如果索引超出范围,则返回错误代码,以便调用方知道停止调用。如果字符串不合适,则使用另一个字符串,以便客户端可以恢复

这是胡说八道,大小由参数1给出,而不是0。只要完全移除它,pinvoke marshaller就不需要任何帮助来计算数组的长度。它已经知道,它使用数组的Length属性

    wcsncpy(*(providers + i), stringToPopulate,
            min(wcslen(stringToPopulate), MAX_STRING_LENGTH ));
wcsncpy是一个邪恶的,邪恶的功能。您通常会收到Microsoft C/C++编译器对此的强烈反对,并警告您这是不安全的。不要忽视这样的警告。它通过执行不可想象的操作来解决“字符串不适合”问题,它不会零终止字符串。当这种情况发生时,调用者总是会出现故障,毫无希望地在字符串末尾出错。AVE是(几乎)不可避免的,如果它没有读垃圾。你使用它的方式,这将永远发生

这可能是为了使函数安全,但却实现了相反的效果。核心问题是调用方无法指定字符串缓冲区的大小。因此,您应该重写它,以便它可以指定该大小。例如:

 MYDLL_API int __stdcall getOneString(int index, wchar_t* buffer, size_t bufferLength)
现在它很简单而且总是安全的,客户端代码只是重复调用它,增加索引参数。它不必猜测需要通过多大的数组。而且您的C代码不必猜测缓冲区有多大。如果索引超出范围,则返回错误代码,以便调用方知道停止调用。如果字符串不合适,则使用另一个字符串,以便客户端可以恢复

这是胡说八道,大小由参数1给出,而不是0。只要完全移除它,pinvoke marshaller就不需要任何帮助来计算数组的长度。它已经知道,它使用数组的Length属性

    wcsncpy(*(providers + i), stringToPopulate,
            min(wcslen(stringToPopulate), MAX_STRING_LENGTH ));
wcsncpy是一个邪恶的,邪恶的功能。您通常会收到Microsoft C/C++编译器对此的强烈反对,并警告您这是不安全的。不要忽视这样的警告。它通过执行不可想象的操作来解决“字符串不适合”问题,它不会零终止字符串。当这种情况发生时,调用者总是会出现故障,毫无希望地在字符串末尾出错。AVE是(几乎)不可避免的,如果它没有读垃圾。你使用它的方式,这将永远发生

这可能是为了使函数安全,但却实现了相反的效果。核心问题是调用方无法指定字符串缓冲区的大小。因此,您应该重写它,以便它可以指定该大小。例如:

 MYDLL_API int __stdcall getOneString(int index, wchar_t* buffer, size_t bufferLength)
现在它很简单而且总是安全的,客户端代码只是重复调用它,增加索引参数。它不必猜测需要通过多大的数组。而且您的C代码不必猜测缓冲区有多大。如果索引超出范围,则返回错误代码,以便调用方知道停止调用。如果字符串不合适,则使用另一个字符串,以便客户端可以恢复

这是胡说八道,大小由参数1给出,而不是0。只需将其完全移除,pinvoke marshaller不需要任何帮助即可计算