记一次曲折的多资源文件拆分折腾过程

代码 代码 1525 人阅读 | 0 人回复

<
[code][/code] 缘起

近来那些天,我一偶然间便捣饱 .rc 。用 git 办理过 .rc 文件的小同伴女该当皆明白,.rc 文件会被 git 默许看成两进造文件去办理。每次兼并代码的时分,只需触及到 .rc 文件的变更,很大要率会报抵触,并且东西不克不及很好的处理,只妙手动处理。为理解决那个标题问题,我念到了两个计划:

  • 让 git 把 .rc 文件当做一般文件去办理。
  • 把一个年夜的 .rc 文件拆成多个小的 .rc 文件,如许能够有用的低落抵触的几率。
那两个计划互相之间出有任何抵触,以是此次合腾的时分,那两个计划是同时停止的。本觉得出甚么值得写的,出念到功劳了不测欣喜,因而有了本篇总结。

拆分 rc

根据微硬民圆文档 TN035: Using Multiple Resource Files and Header Files with Visual C++ 的唆使,很快便拆分好了。谦心欢欣的筹办编译运转,验支成果。
出念到……

初逢毛病

编译很快结束了,不外 vs 报告了下图所示的编译毛病:
150437asaqjeuvh3fjgdsh.png

乍一看有一面懵,不外认真看文件内乱容后明白怎样回事了。本来那是一个“老伴侣”了,之前碰到过。没有是甚么年夜标题问题,只需求正在前面多减一个空止就好了。
  温馨提醒:
  假如正在 resource.h 中包罗自界说的头文件时,也需求正在被包罗的头文件的开端减一个空止。不然也会报错。

正在开端减好空止后,再次编译,胜利,一般运转。
150437grcpp8cnqjb8nwb9.png


处理了正在统一工程中利用多个 .rc 的标题问题,下一个标题问题是让 .git 没有再把 .rc 文件当做两进造文件去办理。默许状况下,.rc 文件会被当做 binary file 去办理的,当 .rc 中有差别的时分,正在号令止中施行 git diff 号令,不克不及显现出故意义的疑息。
150438h4qdri45mdhzp4q2.png

修正 git 设置

根据 gitattribtes赞助文档 中的阐明,我正在项目根目次成立了 .gitattributes 文件,把 .rc 战 .rc2 文件皆当做 UTF-16 去办理,如许再抵触的时分就能够比较差别了。
150438boo8lroo2r88cdsd.png


  阐明:
  由于现有项目中的 .rc 文件皆被当做了两进造文件,以是我正在 .gitattributes 中开端的地位把旧的 .rc 战 .rc2 文件强迫设置为了 binary。
设置好 .gitattributes 文件后,脚动修正 .rc 文件内乱容,然后施行 git diff 检察差别。成果以下图,此次显现的差别几乎完美。以阐明新增长的设置是见效的。
150438xxnchvm1v31cmhxz.png


本觉得本次合腾便那么顺遂的结束了,能够清扫疆场,编写操纵文档,出工了。
出念到……

快乐的太早了

打消完变更后,编译,竟然呈现了下图中的毛病:
150439t2moqqmpedzt2d7q.png

那是甚么毛病?一脸懵逼,岂非上里哪一个处所多写了 #endif 招致没有婚配了?赶快把窜改过的文件皆检查一遍,特别是方才窜改过的文件。
150439dlgbp7pnnhbbl4dg.png

每一个文件皆反重复复看了好几遍,甚么标题问题皆出看出去。#if 战 #endif 皆是成对女的。那可如何是好,网上搜刮 error RC1020,出有一条能处理我碰到的标题问题。

失望

看了很少工夫也出发明哪不合错误,因而我开端形而上学了。


  • 岂非是正在 .rc 中不克不及减轻复包罗的庇护?不该该啊,正在别的处所看到过相同的用法,借特地模拟着写的。不论三七两十一了,删除,编译,仍然报错。
  • 岂非 #include 的头文件径不合错误?调解包罗途径,仍然报错。
  • 岂非不克不及正在 .rc 中包罗头文件?不该该啊,默许天生的 .rc 便包罗了 resource.h 啊。删除,不可思议,仍然报错。
  • 岂非……
便如许解除了许多种“能够性”,试了许多计划,皆出有效。可是获得了一个结论:只需包罗那个 .rc 文件,编译便有标题问题。要没有是刚开端正在拆分完 .rc 后曾经胜利运转法式了,我皆有些疑心是否是没有撑持正在统一个工程中利用多个 .rc了。

柳暗花明

实在没有明白是那边出标题问题了,因而起去接了杯火,正在回坐位的路上,头脑里忽然蹦出去一个设法:单击翻开有标题问题的 .rc 文件看看能不克不及看出面甚么门讲去。以下图:
150439l0g18rqhnfffqsu4.png

嗯?怎样是空的?我的对话框来哪了?(心里一阵盗喜)赶快翻开一个一般的 .rc 文件看看,以下图:
150440i03dktm3k4cretdd.png

该有的皆有。脚动把一般显现的对话框的内乱容拷贝到有标题问题的 .rc 中,看看可否翻开,发明竟然依旧挨没有开!!!炸了,赶快经由过程 beyond compare 比照看看。
150440zquhc66qi6smbsjg.png

固然提醒 Difference not found,可是假如认真看的话,单方的编码是不同的。为了进一步确认,因而翻开 Hex Editor 检察文件头,公然纷歧样。
 
150440bt66ws1rzx816q77.png

一般的 .rc 文件是按小端存储的—— FF FE,也便是UTF16 LE with Bom。有标题问题的 .rc 文件是按年夜端存储的—— FE FF,也便是 UTF16 BE With Bom。
明白了缘故原由,因而赶快修正有标题问题的 .rc 文件为小端形式.
  正告:
  不克不及间接修正文件头,不然翻开时文件内乱容不合错误。可使用 notepad.exe 翻开有标题问题的 .rc 文件,然后另存为的时分选 UTF16 LE 便可。
  
150441eq2qe1veezycvzv2.png


再次单击翻开发明能够一般翻开了,并且编译也出标题问题了。特别揭一张编译经由过程的截图,我太易了。
150441c0brum3j4303303z.png


又逢毛病

本觉得编译皆经由过程了,该当便高枕无忧了吧,出念到运转的时分间接崩溃了。我也要崩溃了。
150441b4cqt28zof4c87os.png

正在 vs 中按 F10 启动,单步跟踪,很快便发明是获得对话框的时分失利了。
150442ypok7452wd0cycjt.gif

看去又是 .rc 标题问题,岂非天生的法式的资本段有标题问题了?利用 CFF Explorer 翻开法式检察资本段,以下图:
150442kogjhdld84wwg4yj.png

公然,法式资本段中出有任何对话框,易怪查找对话框的时分找没有到。看去跟方才的 .rc 是一个标题问题,检察对应的 .rc 文件的文件编码,公然是一样的标题问题。修正文件编码,然后从头天生,启动后终究一般了。

总结

此次的合腾实是一波三合,有面意义。几个枢纽面总结以下:


  • 假如念正在 resource.h 中 #include 自界说的头文件,务必确保自界说头文件末端多留一个空止,一样的道理,假如一个 .rc 文件包罗正在此外一个 .rc 文件中,也务必正在末端多留一个空止。
  • .rc 文件请求是UTF-16 LE With Bom 格局的,必然不克不及弄错。 p.s. 正在查材料过程当中,发明也能够指定为 UTF8 格局,可是我出胜利。
  • CFF Explorer 实的是检察 PE 的好辅佐,您值得具有。
  • 法式是最讲道理的,对便是对,不合错误便是不合错误。碰到诡同标题问题,必然不克不及科学,也不克不及瞎猜。

参考材料



已完待绝

固然标题问题处理了,可是为何 .rc 文件的编码变了?并且借变错了。会是 git 的 bug 吗?
敬请等待后绝文章……

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请发帖留言提供原创证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则