修改函数入口点(转)
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选项即可。
相关文章推荐
- 修改函数入口的方法
- C++修改入口函数名Main的方法
- 如何为WPF添加Main()函数 程序入口点的修改
- C++修改入口函数名Main的方法
- 修改PE文件的入口函数OEP
- 函数内定义的static变量怎样在外部访问和修改
- fckeditor在php中的用法(添加于修改写成了函数)
- Java端无需修改正确调用Matlab函数方法
- c/c++ 入口函数
- linux驱动的入口函数module_init的加载和释放
- PHP chmod 函数与批量修改文件目录权限
- 【漏洞分析】两个例子-数组溢出修改返回函数与strcpy覆盖周边内存地址
- ioctl函数,可以获取ip地址,修改ip地址,网卡地址等
- 在入口函数Hook的分析
- Windows 应用程序的入口函数编写
- SQL Server获取存储过程、表、自定义函数的最后修改时间
- 修改caffe源代码从添加loss(层)函数开始
- 论自定义的控件如何在xib中使用,自定义控件在xib中的初始化入口函数
- 关于用函数修改String的问题
- STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口