今天碰到了一个小问题:
在一个win32控制台程序中调用了MFC写的dll,想隐藏其dos黑框,因此从网上找了最常用的隐藏黑框的解决方法:
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"wmainCRTStartup\"" ) // 设置入口地址
具体原理网上也有详细介绍,简言之:
告诉windows系统,此程序的子系统类型为窗口,但是又将其入口点指定为控制台程序的入口点。
那么修改完编译成Release版本后,发现程序启动报错,
幸好Windows在报错时有个提示:是否上报错误信息,从这个错误信息中可以拿到一个dump文件,顺势定位了一下这个dump;
发现报错代码为:
if (!pThread->InitInstance()) 这一行
其中pThread为NULL ,然后网上继续查找此类错误信息,得到的结论是:
pThread未初始化,而这个的初始化是在CWInApp 类的InitInstance中做的,而CWinApp类是MFC的;
由此推断:
程序的入口点并不是Win32控制台程序的入口点,因此项目属性中程序入口点设置没有成功,遂改成wmainCRTStartup;
改完之后发现编译不过 提示找不到_wmain, 再检查一遍代码发现 在Unicode环境下 main函数应该写成wmain 。
总结:
记住下面这张表(取之于Windows核心编程):
应用程序类型 | 入口点函数 | 嵌入的可执行文件的启动函数 |
ANSI的GUI程序 | _tWinMain(WinMain) | WinMainCRTStartup |
Unicode的GUI程序 | _tWinMain(wWinmain) | wWinMainCRTStartup |
ANSI的CUI程序 | _tmain(Main) | mainCRTStartup |
Unicode的CUI程序 | _tmain(Wmain) | wmainCRTStartup |
这是很基础的Windows编程知识,勿忘!