您的位置:首页 > 其它

修改函数入口点(转)

2011-09-30 16:04 218 查看

修改函数入口点(转)

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选项即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: