常见问题的解決方案
Error LNK2001: unresolved external symbol _main
一个未解析外部符号错误发生于:一个地方调用了一个外部函数,但是链接器在你所有模块和你链入的所有库中都找不到这个函数.
这种情況可能有两种原因或其中之一. 要么你想写一个Win32
GUI应用(或是一个非console的应用)但是卻将其以console应用来编译...或是你真正的想要编译一个console应用但沒有正确地写或是编译main()函数.
一般来说第一种情況居多,如果你在VC++中创建工程时指定了Win32 Console工程类型你就会得到这个错误.
用BC++的命令行工具来编译的时候沒有指定正确的选项使其以一个Win32 GUI应用来编译,它就会以默认的console应用来编译,这样也会得到这个错误.
修复方法
如果是用的VC++就重新创建你的工程并选择Win32 应用工程类型(不是Console).
如果用的是BC++命令行编译器,加上-tW选项指明它是一个windows应用.
Error C2440: cannot convert from 'void*' to 'HICON__ *' (or similar)
如果你在编译本教程中的代码,意味著你在以C++代码在编译它.这些代码是为bcc32
和VC++的C编译器写的,所以并不能精确地以C++编译,因为C++的类型转換的规则更严格些,C++需要你显示地转換.
VC++(大多数编译器也是这样)会自动将一个.cpp文件以C++代码来编译,.c的文件就以C代码来编译.如果你把教程中的代码放入一个.cpp文件,这应该就是错误的产生原因.
如果你不是在编译这个教程中的代码,那我就不能确定是否如上述,有可能的确存在一个要解決的错误.需要你自己来判断能不安全地做強制转換以消除这个错误,否则的话,你就有可能把一个变量转到不能转到的地方.
修复方法
如果想用C,就把你的.cpp文件改为.c就是了.再就是加一个简单的強转,教程中的代码以C++编译的话只需要这个修改.
例如,在C中这样可以:
HBITMAP hbmOldBuffer = SelectObject(hdcBuffer, hbmBuffer);
但在C++中就需要一个強转:
HBITMAP hbmOldBuffer = (HBITMAP)SelectObject(hdcBuffer, hbmBuffer);
Fatal error RC1015: cannot open include file 'afxres.h'.
非常奇怪的是,VC++在资源文件中加入了afxres.h,就算你沒有用MFC的工程类型也是如此,而且这个文件只有你装了MFC才会有.这个郁闷的文件并不是必需的,所以要修正这个错误,可以用一个编辑器打开.rc文件并用』winres.h”替換掉两个”afxres.h”就行了.(注意应该有两个,两个都要換).
Error LNK2001: unresolved external symbol InitCommonControls
你沒有链入这个API被定义的comctl32.lib.这个库不是默认加入的,所以要么在你的命令行中加进去,要么在VC++的工程设置中的Link属性项中加入.
Dialog does not display when certain controls are added
ListView,TreeView,Hotkey,Progress
Bar,等控件被规类为通用控件,因为它们随著comctl32加入windows,于Windows95之前并不存在.而Button,Edit,ListBox等等控件毫无疑问也很通用,但不是”通用控件”,一般称为”标準控件”.
如果把一个通用控件加入到一个对话框后不能显示的话,很可能是在你运行对话框之前调用InitCommonControls()失败,或许肯定是这样的.调用它的最好的地方是WinMain()的开始.在WM_INITDIALOG就太晚了,因为对话框会在这之前就创建失败,从而使它永远沒有机会被调用.
有些人和文档可能告诉你InitCommonControls()已经过时了,你应该调用InitCommonControlsEx().如果想那样做的话也是可以的.但InitCommonControls()就是简单点而已,并沒有一点错误.
|