- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有 .NET Framework 3.5 的 Visual Studio 2008 并制作一个 C++/CLI/.NET Forms 应用程序;游戏编辑器。除了编辑器之外的所有游戏代码都是纯 C++。我已经到了需要从非托管代码调用表单代码中的回调的地步。
我正在使用 GetFunctionPointerForDelegate。
首先,我的 Form 类中有这些:
public: delegate void ADelegate(Int32, float, float, float, Int32);
public: static ADelegate^ delegateInstance;
然后我在 Form 构造函数中设置回调:
// Set up World Objects callback
typedef void (__stdcall *WorldLocationUpdateCallback)(Int32, float, float, float, Int32);
WorldLocationUpdateCallback _callback;
// Create an instance of a delegate, using GetFunctionPointerForDelegate
delegateInstance = gcnew ADelegate( this, &MainForm::InitWorldObjectPane );
// Convert the delegate to a pointer
IntPtr anIntPtr = Marshal::GetFunctionPointerForDelegate( delegateInstance );
// Cast the pointer into a function pointer
_callback = static_cast<WorldLocationUpdateCallback>(anIntPtr.ToPointer());
CEditorUI::UI()->setWorldLocationUpdateCallback( (void*)_callback );
所以我存储指针并在非托管代码中,在我的应用程序初始化的早期从不同的线程调用回调:
// Set up World Object pane in editor to use this map/maptile/etc
{
typedef void (*WorldLocCallback)(int, float, float, float, int);
void* _callback = CEditorUI::UI()->getWorldLocationUpdateCallback();
int _mapId = charGfxObj->getMapId();
float _posX = charGfxObj->getPos().x;
float _posY = charGfxObj->getPos().y;
float _posZ = charGfxObj->getPos().z;
int _tileRadius = TILE_RADIUS;
((WorldLocCallback)(_callback))( _mapId, _posX, _posY, _posZ, _tileRadius );
}
在我关闭应用程序之前,一切都在我的应用程序中完美运行,功能正常。它总是在调用线程中因缓冲区溢出错误而终止,调用堆栈相当无用:
editor.exe!__crt_debugger_hook() Unknown
>editor.exe!__report_gsfailure() Line 298 + 0x7 bytes C
editor.exe!__CorExeMain@0() + 0xe3 bytes C++
这里的问题在于,即使回调实际上什么都不做,它也会崩溃。要导致崩溃,我所要做的就是启用调用回调的最后一行代码。禁用该行后,没有问题。请记住,崩溃仅在退出时发生,而不是在实际使用回调时发生。
有什么建议可以尝试吗?
最佳答案
在整整一天搞砸并搜索其他相关内容后,我稍微解决了这个问题,以防其他人遇到这个问题。
将委托(delegate)声明移到类之外并用以下方法装饰它:
[UnmanagedFunctionPointerAttribute(CallingConvention::Cdecl)]
...帮我解决了。显然cdecl的清栈效果解决了溢出问题。
关于c++-cli - 使用 Marshal::GetFunctionPointerForDelegate 并从非托管代码调用回调会导致退出应用程序时缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16272558/
我想知道 Marshal.GetFunctionPointerForDelegate。也就是说,我想知道它如何将委托(delegate)转换为非静态函数的函数指针。 它是否动态生成以某种方式附加了实例
我正在将托管 System.Action 转换为 C++/CLI 项目中的非托管 std::function;我应该在使用回调后释放给定的 IntPtr 还是不需要? void MyClass::Ex
我正在使用 Marshal.GetDelegateForFunctionPointer() 从 C# 调用 native x64 代码。我将一个指针作为参数传递到 native 代码中。我从 Mars
这是导致 MarshalDirectiveException 的代码示例。很好的解释SafeHandle可以找到 s here . [SuppressUnmanagedCodeSecurity] pr
我正在尝试使用具有回调机制的 (C) 第三方库,该机制缺少任何可能的识别调用上下文的方法。我的主要项目在 C# 中,我的包装器是一个调用 C 库 API 的 C++/CLI 项目。 为了解决这个问题,
我正在使用带有 .NET Framework 3.5 的 Visual Studio 2008 并制作一个 C++/CLI/.NET Forms 应用程序;游戏编辑器。除了编辑器之外的所有游戏代码都是
如上所述,在尝试将委托(delegate)作为回调传递给 native DLL 时,我需要知道这两种可能性之间的区别。我有时必须使用第一个,有时必须使用第二个才能使我的代码正常工作。但是,我不清楚有什
我正在尝试使用托管 C++ 将 C# 委托(delegate)转换为 C++ 函数指针。这是我们之前使用的方法: // Define a delegate public delegate void A
尝试使用 GetFunctionPointerForDelegate 通过互操作传递函数指针,(C# -> C++)。但是,我收到异常:指定的类型不能是泛型类型定义。 据我所知,我没有传递通用类型定义
我正在使用 Marshal.GetFunctionPointerForDelegate获取指向 native 函数的函数指针。然后,我通过常规 DllImport 机制将此函数指针传递给一些非托管代码
我曾经像这样从 C# 注册一个委托(delegate)到回调函数指针(不使用 Marshal.GetFunctionPointerForDelegate): C++(测试.dll) typedef v
我是一名优秀的程序员,十分优秀!