我在Visual Studio 2010中创建一个非托管DLL。
为了测试我的DLL,我用Visual Basic创建了另一个项目,并将其附加到解决方案中。
VB代码调用DLL中的InstallHook函数,在VB处传递回调函数的委托。然后DLL创建一个钩子,每次按下一个键时,VB回调被称为接收密钥和其他一些参数作为参数。
嗯,问题是在按下某些键后,VB回调中的缓冲区达到特定大小,程序崩溃。更具体地说,当最后一次调用回调并且它在VB中写入其缓冲区时,就像它在某处重叠一样,因为下次要在DLL中调用回调时,程序崩溃而没有达到回调(dll中的指针很好)
我不太了解.Net的架构,我也不知道究竟出了什么问题,但我对我已经完成的代码非常有信心,问题应该是.Net中的内存管理技术问题。
编辑:我忘了说如果我从VB代码中调用回调,那么它工作正常。回调通常是从安装在同一窗口中的WndProc调用的。
...谢谢
答案 0 :(得分:3)
dll中的指针很好
我怀疑这是问题所在。如果将地址传递给本机例程,然后将其用于单个方法调用的范围之外,则会产生一些风险。
问题是.NET使用压缩垃圾收集器。这意味着运行时可以将缓冲区“移动”到方法调用之间的完全不同的位置。因此,在某些时候,当你写信给它时,它可能处于一个完全不同的位置。
您可以通过Marshal类自行分配和管理内存来解决这个问题。或者,您可以使用GCHandle class to pin the memory and prevent it from being moved。