知识大全 VC++.NET几个比较难缠的问题及其解决方法
Posted 知
篇首语:一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VC++.NET几个比较难缠的问题及其解决方法相关的知识,希望对你有一定的参考价值。
VC++.NET几个比较难缠的问题及其解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
问题一 HWND和System Inptr 的转换
如果你用惯了VB NET 你一定会认为窗体的Handle属性就等同于API里面要的那个HWND——的确 MSDN里面就是这么说的 而且 在VB NET里你可以这样写ShowWindow(Me Handle SW_SHOW) 这一切看上去没有错误 而且字面意思上是如此理所当然 但是 进入了CLR C++的环境 ShowWindow(this >Handle SW_SHOW)的直接结果就是编译器扔给你一句编译错误 类型不匹配 无法将System Inptr 转换为HWND
事实很明显 Handle并不如MSDN里面说的那样就是HWND VB NET在把Handle传进API的时候进行了类型转换 如果你有把VB NET程序移植到CLR C++或者在CLR C++里面使用用VB NET的程序集的经验 就会对这些深有体会 CLR C++最大的问题在于 它对绝大部分的 NET数据类型都要求用户显式地转换 而著对于 NET Framework来说没有类型自动转换显然是非常痛苦的
我们再说回这个Handle 可能有人会这样说 我这样写可不可以呢?
ShowWindow(HWND(this >Handle) SW_SHOW)
于是编译器再次给了你脸色看 还是那个错误
接着就有人发现 Handle还有一个方法 ToPointer 这次看上去问题肯定能解决了 不是么?Pointer就是指针 HWND不也是一个指针吗?
于是 又有人提议 ShowWindow(this >Handl ToPointer() SW_SHOW)
意思上是完美了 但是 非常遗憾 编译器说 我只认类型 不看意思 于是又报了一个错误出来
做到这里 看上去已经是山穷水尽了 其实失败和成功只有一步之遥 HWND和void*是可以互相转换的!我们只要再继续多写一步 ShowWindow(HWND(this >Handle ToPointer()) SW_SHOW) 问题就可以解决
接下来是第二个问题 还是这个ShowWindow 并不是所有场合我们都喜欢使用这样的语句
This >Show()
有时候 我们得使用ShowWindow来达到某些显示的效果 当我们兴高采烈地庆祝我们解决了Handle的转换时 我们会惊讶地发现 ShowWindow显示出来的窗口什么也没有!上面的控件都不见了!
当我看到这个现象的时候 我脑袋里立刻想起一个东西 Borland C++ Builder
是的 这个现象与Borland C++ Builder里的窗口显示特性简直一模一样!据说 NET Framework总的设计师就是那个大名鼎鼎的从Borland跑到Microsoft的安德森 果然有风格(可惜的就是MFC却没学到VCL的方便 倒是 NET学了这个见鬼的特性) 怎么办呢?细心的人会发现 当我们对窗口执行 this >Show() 的时候 显示出来的窗口是无焦点的 也就是说 我们不再需要ShowWindow这个API了(因为这个API一般都是用来显示无焦点的窗体) 我们只要在Show()执行之后设置窗口的WindowState
例如 Msgform >WindowState =System Windows Forms FormWindowState Normal
问题三 打包安装
程序写完了 以为终于可以松口气了 把程序和 NET Framework安装包拿到别人那里一安装 居然发觉弹出个错误对话框 程序配置不正确
这是典型的缺少运行时错误 于是就奇怪 MSDN不是说 NET程序可以XCopy部署的么?只要有 NET Framework 就只要拷贝程序到目标机器上面就可以运行的啊??!!
的确 对于vb和C#的程序 xcopy部署不会存在任何问题 因为这两门语言都是给 NET量身订做的 但是C++不是 结果回去查看了程序和clr c++程序引用的dll 发现托管的C++程序比程序多引用两个dll
MSVCR D dll MSVCM D dll
然后我用reflector反编译我的程序 发现程序配置头xml文件里面有如下内容
<?xml version= encoding= UTF standalone= yes ?> <assembly xmlns= urn:schemas microsoft :asm v manifestVersion= > <dependency> <dependentAssembly> <assemblyIdentity type= win name= Microsoft VC DebugCRT version= processorArchitecture= x publicKeyToken= fc b b a e e b /> </dependentAssembly> </dependency> </assembly>注意Microsoft VC DebugCRT(当你编译程序使用Debug模式就会产生)!
刚刚说的那两个dll就是Microsoft VC DebugCRT的部件 现在你知道少了什么了吧?
于是我们必须把Microsoft VC DebugCRT组件一起安装到目标机器上面 但是Microsoft VC DebugCRT上哪找呢?
我们新建一个安装部署项目 然后添加合并模块 你会看到打开的默认文件夹里面有这个文件
policy_ _ _microsoft_vc _debugcrt_x msm
猜都猜到这是什么了吧?添加进去!
cha138/Article/program/net/201311/12140相关参考
一什么是架构 和架构相关的几个问题域 架构需要解决的非业务问题域包括如下 A系统目标系统性能稳定性 B项目目标开发成本质量 C项目过程需求的不确定性和开发过程的团队协作性 不同的问题域
VC++.NET开发环境整合技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 主窗口内的每一个
用VC.NET制作启动屏幕的新方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在利用VC+编
VC#.Net中浏览CrystalReport 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
知识大全 VC# .Net中使用Crystal Report(一)
VC#.Net中使用CrystalReport(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 VC# .Net中使用Crystal Report(二)
VC#.Net中使用CrystalReport(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
VC.NET索引对查询条件顺序的影响 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 环境SqlS
使用VC.net轻松实现按钮控件自绘 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用&nbs
VC++.NET中使用GDI+创建特效字体 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!来自于微软
VC.NET扩展Windows磁盘清理工具的功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!