非常急,在线等着.wWinMainCRTStartup设置程序入口问题

vc_love2010 2010-05-26 03:22:03
大家好.我目前在将我的工程变成支持unicode. 我已经修改完好几个模组.这些模组都是用MFC建立的.我一般都是修改两个地方,第一将 Entry-point symbol :修改为 wWinMainCRTStartup .第二将 _MBCS 修改为 _UNICODE,UNICODE ..一切正常...
可是我现在要修改一个非MFC的工程,可能是win32控制台的程序,其中文件后缀都是.c.该工程build出来是个dll.我还 把Entry-point symbol :修改为 wWinMainCRTStartup 可是提示错误

error LNK2001: unresolved external symbol _wWinMain@16
..\..\ATT\Exec\Fa32.dll : fatal error LNK1120: 1 unresolved externals

我不知道该怎么弄,谁知道告诉我,非常非常感谢....

补充:我试过 用 wmainCRTStartup,mainCRTStartup做为入口都不行.......
...全文
766 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou1xp 2010-05-27
  • 打赏
  • 举报
回复
会不会是系统在加载一个dll的时候,也是先执行DllMainCRTStartup 然后再执行我们的DllMain ?

这个要等待高手来解答了,要不楼上开个帖子来讨论下
finder_zhang 2010-05-27
  • 打赏
  • 举报
回复
讨论是离了楼主的主题,但大家学习了,也可能对楼主解决问题有帮助.

测试过了一下,用IDA也观察过.
在正常的时候,我们执行一个exe文件,系统先执行mainCRTStartup,在里面执行__security_init_cookie();GetStartupInfo( &StartupInfo ); _tcmdln = (_TSCHAR *)GetCommandLineT(); 等等的动作,最后分析好参数的数据,再执行main,传参给main函数.

如果把入口点设成自定义的函数,那么将不再执行mainCRTStartup,main函数里也得不到传入的命令行参数了.

35楼,用IDA看过一下DLL的文件,与EXE也很类似.
正常的一个最简单的DLL文件,里面有 DllMainCRTStartup 函数,里面再去调用 DllMain
会不会是系统在加载一个dll的时候,也是先执行DllMainCRTStartup 然后再执行我们的DllMain ?
但如果我们设一个自己的entrypoint的话,再看DLL的文件就变成了里面只有一个MyDllEntry函数了
zhou1xp 2010-05-27
  • 打赏
  • 举报
回复
主要是DLL只是用来被调用的,一个程序要调用DLL插入,它本身肯定是有入口函数的,所以DLL中式无所谓入口函数的,不知道大家认为这个理解有问题没有
向立天 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 finder_zhang 的回复:]
发现我反客为主了,借楼主的分,自己在问问题.哈哈.
[/Quote]
你这样确实不合适
不过我还是会最后回答你一次
系统执行的是mainCRTStartup
我们自己定义的入口函数只是给你链接器提供的接口
finder_zhang 2010-05-27
  • 打赏
  • 举报
回复
发现我反客为主了,借楼主的分,自己在问问题.哈哈.
finder_zhang 2010-05-27
  • 打赏
  • 举报
回复
再请教一下向版主,意思是不是,假如我把入口点改成 MyMain ,那么系统在加载我的程序时,就不去执行原来的mainCRTStartup 函数,而是直接执行我的 MyMain 函数,这样?
向立天 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 finder_zhang 的回复:]
谢谢,十分感谢24楼与26楼的回复.
我试过一下,把程序里的 main 函数,改名为 MyMain,然后再在Project里的入口点同样改为MyMain
结果是跟没改之前一样的.

可不可以认为我们改的这个入口点就是告诉mainCRTStartup函数,到时到底要执行我们模块里的哪一个函数的?
[/Quote]
你看我在24楼的回复
我们自定义的入口函数只是在告诉链接器嵌入哪个执行体

我想了一下
楼主你试试把文件扩展名改为cpp试试
finder_zhang 2010-05-26
  • 打赏
  • 举报
回复
谢谢,十分感谢24楼与26楼的回复.
我试过一下,把程序里的 main 函数,改名为 MyMain,然后再在Project里的入口点同样改为MyMain
结果是跟没改之前一样的.

可不可以认为我们改的这个入口点就是告诉mainCRTStartup函数,到时到底要执行我们模块里的哪一个函数的?
Eleven 2010-05-26
  • 打赏
  • 举报
回复
GUI应用程序的进入点是:WinMain/wWinMain,嵌入到可执行文件的启动函数是WinMainCRTStartup/wWinMainCRTStartup。

CUI应用程序的进入点是:main/wmain,嵌入到可执行文件的启动函数是mainCRTStartup/wmainCRTStartup。
wltg2001 2010-05-26
  • 打赏
  • 举报
回复
补充:我试过 用 wmainCRTStartup,mainCRTStartup做为入口都不行.......
============
DLL不同于EXE吧,它应该没有WMainCRTStartup之类的入口函数吧。
wltg2001 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 finder_zhang 的回复:]
18楼,请教一下,系统是不是在我们执行一个exe的时候,假设如果是窗口的,那么系统会执行wWinMainCRTStartup,然后 wWinMainCRTStartup 再去执行我们的 wWinMain 这样的?
[/Quote]
是这样的,main或是WinMain只是我们自己程序的入口函数,程序并不是真的从这两个函数开始执行的,C/C++运行库会为它们加上wWinMainCRTStartup之类的入口,分为ANSI,UNICODE两类共是四个。其实我们WinMain中的一些参数,也并不是操作系统给它的,而是在wWinMainCRTStartup之类的入口函数中通过API的调用得到的。比如HINSTANCE hInstance,这个就是通过GetModuleHandle得到的,然后传给WinMain的。
vc_love2010 2010-05-26
  • 打赏
  • 举报
回复
哎,我也不知道该怎么说,谢谢大家了...
向立天 2010-05-26
  • 打赏
  • 举报
回复
To:finder_zhang是这样的wWinMainCRTStartup是执行体函数,从名字中的CRT我们就能看出来它是C runtime的也就是C的运行时函数,当程序运行的时候操作系统会嵌入执行体函数,而实际上我们链接程序时链接器就已经将我们的入口函数替换为执行体函数了,你应该也知道,我们是可以改变入口函数名的,但是我们没有办法改变执行体函数

对于这个问题
我觉得应该是这个工程没有显示的实现dll的入口函数所指
finder_zhang 2010-05-26
  • 打赏
  • 举报
回复
楼主现在有问题的,到底是 MFC WIN23 Console 还是 DLL ?
finder_zhang 2010-05-26
  • 打赏
  • 举报
回复
楼主,你能确定你现在报的错,是入口函数的问题,还是其他UNICODE参数错误的问题吗?

要不要重新来一次,不要动入口函数,只改与UNICODE有冲突的?

我就试过一下,入口函数设为 wmainCRTStartup (只楼主说的,我不确定这样设是否有用)
然后我写了一个 wmain ,可以正常的.但如果我写了 main ,就报错了.

但入口点什么也不设的话,用main wmain 运行都没问题.
vc_love2010 2010-05-26
  • 打赏
  • 举报
回复
哎,我试了都不行啊...我是在改uniocde 才涉及到这问题的...
finder_zhang 2010-05-26
  • 打赏
  • 举报
回复
18楼,请教一下,系统是不是在我们执行一个exe的时候,假设如果是窗口的,那么系统会执行wWinMainCRTStartup,然后 wWinMainCRTStartup 再去执行我们的 wWinMain 这样的?
finder_zhang 2010-05-26
  • 打赏
  • 举报
回复
楼主,我试过了一下,入口的函数.在UNICODE下面,控制台的,我写 main wmain 都没问题,会自动识别的.
你要不要试试移到UNICODE后,只把 main 改成 wmain WinMain 改成 wWinMain
工程设置里不改

但是MFC的不要去改,MFC的他调用WinMain的自己源代码已经写好的了.
向立天 2010-05-26
  • 打赏
  • 举报
回复
wWinMainCRTStartup
==========
dll的入口函数是这么写么?
不是DllMain么
vc_love2010 2010-05-26
  • 打赏
  • 举报
回复
哎呀,大家答非所问啊.我的问题不在于这,我是把_unicode 和uncode加在了工程的setting中.这点没有问题.问题只是入口函数在mfc下和win32下怎么写的问题
加载更多回复(16)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧