禁用屏幕拷贝(Print Screen),调用派生的析构函数及其它......
2007-03-15 21:56:11 来源:WEB开发网你会注意到在调用 Finalize 方法之前,CBase::__dtor 调用 SuppressFinalize,为什么呢?因为在 C++ 里,当你清除某个托管对象时,系统不会释放那个对象的存储区。至少不会立即释放。在垃圾收集器运行之前,该对象的内存不会被释放。必须用 SuppressFinalize 来避免对象被终结两次——第一次是调用 delete 时,再一次是垃圾收集器运行的时候。明白吗?
有没有办法从 .NET 框架程序集中调用 MFC 扩展 DLL?我知道如何用 P/Invoke 来调用常规的 DLL 或 COM DLL,但是不知道如何处理 MFC 扩展 DLL。
我的回答恐怕是:不要往那儿走。理论上,从托管代码中调用 MFC 扩展 DLL 是可能的;但实际上那是极其困难的。MFC 扩展 DLL 关系到大量 MFC 状态,很难在托管代码中建立这些状态。例如,当你调用 AfxGetApp 获取应用程序对象时,它假定 CWinApp 指针在 MFC 的模块中已被初始化为一个全局指针。如果你用 MFC 编写 COM 对象,你知道要在每一个初始化 MFC 状态的入口处使用 AFX_MANAGE_STATE 或 METHOD_PROLOGUE 宏。
MFC 扩展 DLLs 与 主 EXE 或 宿主该扩展的 DLL 共享一个 派生的 CWinApp。所以,如果你创建一个新的 EXE(即使是本地的),在没有应用程序对象的情况下,也无法加载 MFC 扩展。主 EXE 必须是一个 MFC 应用程序(某些部分可能用 /clr 编译);或者你必须重写你的 DLL,不要将它做成 MFC 扩展 DLL。如果你有后端代码实现业务逻辑或算法,你应该在不需要状态的 C extern 函数中隔离它们,以便用 P/Invoke 调用;或者还有一个办法,将逻辑包装到托管类中(具体细节参见我在 2005 年 09 月的专栏:“拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性” 或者 .NET 文档)。对于用户接口代码,微软对此有明确忠告,就是没有办法从托管代码中调用 MFC。
更多精彩
赞助商链接