修改函数入口点(转)
2010-05-19 21:32:01| 分类: C++编程 | 标签: |字号大中小 订阅
通常在C C++中,对于Console App一般入口函数为main;win32 App入口函数为WinMain。而
且Win32 App的入口WinMain需要固定的申明:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
其实,我们可以通过修改链接选项来改变入口函数。例如下面简单的nomain.c程序:
#include
int fn ()
{
MessageBoxA(0,”Hello world”,”Caption”,0);
}
编译:cl nomain.c /c
链接:link /entry:fn /subsystem:windows nomain.obj user32.lib
说明:上面的代码编译不需要指定额外的选项。存在不存在main WinMain函数对于编译来说它都不
关心。但是在链接的时候就会出错,因为默认情况下,编译器需要找main或者WinMain函数,找到其
地址,把它作为可执行文件的入口。如果是console App,连接器会去找main(_tmain())函数;如果
是Win32 App,链接器回去搜寻WinMain(格式要和规定的严格匹配)。如果找不到,就会报错。
其实,可以通过修改工程选项来改变默认的入口函数。例如,上面的链接语句中,通过指定/entry
为fn(修改为你要设定的入口函数名),就可以让链接器去搜寻名为fn的函数并将其作为exe文件入口。
另外,在程序代码中,可以通过pragma comment(linker,”/entry:fn”)来修改入口函数名。
代码[nomain.c]如下:
#include
#pragma comment(linker,”/entry:fn”)
int fn ()
{
MessageBoxA(0,”Hello world”,”Caption”,0);
return 0;
}
编译: cl nomain.c /c
链接: link nomain.obj user32.lib /subsystem:windows
注意:/subsystem选项一定要记得指定
最后说明一个大家可能出现的错误。上面是在命令行中直接对C代码进行编译的。在此同时,我曾
经打开一个以前的C++Console App,直接用pragma comment来修改linker参数,结果运行出异
常。注意:是运行出异常就说明链接已经成功了,也就是说,entry已经修改了。由于代码是调用
MessageBox,故将工程选项中的subsystem由原来的console修改为windows,发现运行还是
异常。最终发现是修改后的入口函数中还调用了cout输出(原来console代码中直接拷贝遗留的:()。
这里说明一下,在VC IDE AppWizard创建的工程中直接编写代码,照样可以使用上面的方法:直接
在代码中用pragma comment或者在工程选项中的link option中添加/entry:fn(你想要定义的入口
函数名)即可。还有:如果是console app,你想修改为win32 App,修改subsystem选项即可。