修改函数入口点(转)

 

修改函数入口点(转)  

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选项即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值