par*_*y72 10 c# c++ dll windows-xp callback
我有一个使用非托管C++ DLL的C#应用程序.我发现崩溃只发生在WinXP(而不是Win7)中,当我从C++ DLL传回的内存太大时.
基本流程是C#通过调用start函数在C++ DLL中启动一个操作,在该函数中它提供了一个回调.然后,C++ DLL执行操作并将日志记录信息转储到文本缓冲区中.操作完成后,C++ DLL调用回调并将文本缓冲区作为参数传递:
C++:
typedef void (CALLBACK *onfilecallbackfunc_t)(LPCWSTR);
DLL_API void NWAperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback);
l_pFileCallback(_wstringCapture.c_str());
Run Code Online (Sandbox Code Playgroud)
C#:
public delegate void FileCallback([MarshalAs(UnmanagedType.LPWStr)] string buffer);
public static extern void SetOnFileCallback(FileCallback fileCallback);
private void OnFile(string buffer);
Run Code Online (Sandbox Code Playgroud)
这在Win7中工作正常,但在WinXP中,如果缓冲区太大,它会崩溃.我不确定导致这种情况的确切尺寸,但是我已经对它施加了8MB的限制并且崩溃已经消失.
有没有人知道在WinXP中可以在C++和C#之间传输的内存量限制?或者我是否完全误解了这个问题并且有更合乎逻辑的解释?
更新:我应该更具体 - 这发生在具有WinXP和Win7双启动的同一台PC上,两者都是32位操作系统.
所以最终证明我是个白痴。为了使日志变大但加快测试速度,我单击了取消按钮,该按钮调用了 C++ DLL 中的一个函数,该函数停止执行并调用带有“中止”错误的回调函数以及已记录的任何日志。但是当我这样做时,执行并没有立即停止,因此当带有日志的回调正在进行时,C++ 代码可能会尝试添加到日志中。这导致了我所看到的不稳定。
我通过在日志周围使用关键部分来修复它。