Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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+获取回调时,WinXP中的内存限制是多少+;C#中的DLL? 我有一个使用非托管C++ DLL的C语言应用程序。当我从C++ DLL中返回的内存太大时,我发现只有在WiXP(不是Wi7)中发生的崩溃。 基本流程是C++通过调用一个启动函数在C++ DLL中启动一个操作,其中提供一个回调函数。C++ DLL然后执行操作并将日志记录信息转储到文本缓冲区。当操作完成后,C++ DLL调用回调,并将文本缓冲区传递为参数:_C#_C++_Dll_Callback_Windows Xp - Fatal编程技术网

什么';当从C+获取回调时,WinXP中的内存限制是多少+;C#中的DLL? 我有一个使用非托管C++ DLL的C语言应用程序。当我从C++ DLL中返回的内存太大时,我发现只有在WiXP(不是Wi7)中发生的崩溃。 基本流程是C++通过调用一个启动函数在C++ DLL中启动一个操作,其中提供一个回调函数。C++ DLL然后执行操作并将日志记录信息转储到文本缓冲区。当操作完成后,C++ DLL调用回调,并将文本缓冲区传递为参数:

什么';当从C+获取回调时,WinXP中的内存限制是多少+;C#中的DLL? 我有一个使用非托管C++ DLL的C语言应用程序。当我从C++ DLL中返回的内存太大时,我发现只有在WiXP(不是Wi7)中发生的崩溃。 基本流程是C++通过调用一个启动函数在C++ DLL中启动一个操作,其中提供一个回调函数。C++ DLL然后执行操作并将日志记录信息转储到文本缓冲区。当操作完成后,C++ DLL调用回调,并将文本缓冲区传递为参数:,c#,c++,dll,callback,windows-xp,C#,C++,Dll,Callback,Windows Xp,C++: typedef void(回调*onfilecallbackfunc_t)(LPCWSTR); DLL_API void nwraperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback); l_pFileCallback(_wstringCapture.c_str()); C#: public委托void FileCallback([marshallas(UnmanagedType.LPWStr)]字符串缓冲区); 公共静

C++:

typedef void(回调*onfilecallbackfunc_t)(LPCWSTR);
DLL_API void nwraperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback);
l_pFileCallback(_wstringCapture.c_str());
C#:

public委托void FileCallback([marshallas(UnmanagedType.LPWStr)]字符串缓冲区);
公共静态extern void SetOnFileCallback(FileCallback FileCallback);
私有void OnFile(字符串缓冲区);
这在Win7中运行良好,但在WinXP中,如果缓冲区太大,则会崩溃。我不确定导致这种情况的确切大小,但我对其设置了8MB的限制,崩溃已经消失

有人知道在WiXP中,C++和C语言之间的内存量是否可以像这样限制?还是我完全误解了这个问题,有更合乎逻辑的解释


更新:我应该更具体的说,这是在同一台PC上使用WINXP和WIN7双引导,都是32位操作系统。< /P> < P>我不知道Windows或NETFX设置的硬限制,但是我非常怀疑,从C++应用程序返回的数据量可以是完全任意的,这可能导致波动行为。


我强烈建议您考虑将日志数据写入本机组件中的文件,然后从托管代码中读取该文件。这样,不管记录了多少数据,您的托管代码都可以通过它进行解析,而不用担心堆被破坏。

您可以在实际耗尽RAM之前耗尽连续内存。这是使用数组缓冲区的一大缺点。LinkedList(或使用分块的数组)有助于缓解此问题,因为您需要的空间不必是连续的

因此,除非您的应用程序使用2+GB的RAM,否则您的问题更可能是内存碎片

Windows 7管理RAM的方式可能与Windows XP不同,这可能就是您没有看到问题的原因。但是,如果你能提供更多的数据,我相信你也会遇到同样的问题


您可以设置perfmon来跟踪/记录系统的内存使用情况,并设置任务管理器来跟踪您的应用程序。

因此最终证明我是个白痴。为了使日志大而速度快,我在点击取消按钮,它取消了C++执行中的函数,它停止执行,并调用具有“中止”错误的回调函数和任何已经记录的日志。但当我执行时,执行并没有立即停止,所以当日志回调正在进行时,C++代码可以尝试添加到日志中。这导致了我所看到的不稳定


我通过在日志周围使用一个关键部分来修复它。

+1用于有趣的问题。我也想知道这个问题的答案。你说这只发生在Windows XP上?这是XP box x86而不是Win7 x64吗?如果你处理的是64位与32位的体系结构,那可能是问题的根源……扩展Steve的评论,你是否试图编译针对x86而不是AnyCPU的c代码?没有这样的限制。如果您经常传递多兆字节的缓冲区,那么这段代码将向大型对象堆添加大量内容。当然,由于地址空间碎片而导致内存耗尽是可能的。如果您的Windows 7版本为64位,则这一点尤其突出。32位程序可以获得更多的虚拟内存。C#中的字符串不是限制在2GB吗?