我怎么能不写WinMain函数使用一个Windows应用程序?
题
写在C / C的Windows GUI应用程序++有 '的WinMain' 作为入口点(而不是 '主')。我对此的理解是,编译器生成一个“主”功能,通过C运行时调用。这个“主”函数设置用于GUI所需的环境并调用“的WinMain”(指定实例处理等)。
在短,相信控制台和GUI应用程序启动时以下面的方式有所不同:
控制台应用: C运行时 - > '主' 功能(手工编码的)
GUI应用: C运行时 - > '主' 函数(编译器生成的) - > '的WinMain' 功能(手工编码的)
我想都验证此理解并了解如何可以手工编写一个Windows GUI只需“主”功能(即,而无需编写“的WinMain”)。
解决方案
您有不正确的认识。主的WinMain之间的差,除了一些differet初始化代码,是传递给它的参数。
主要是这样的:
int main(int argc, char* argv[]);
虽然WinMain中看起来像这样:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
东西已经设置这些参数,并拨打电话,这是启动代码。当编译和链接程序,链接器参数中的一个是入口点,这将是,取决于控制台或GUI应用程序中,启动代码不同的位
您当然可以编写自己的启动代码,只要进入你的VISUAL C ++源代码目录,你可以找到启动代码,这就是所谓的crt0.c,它是在VC \ CRT \ src目录。
其他提示
只有主,你不能编码的WinMain。对于理由,均取自发言之后 http://blogs.msdn.com/oldnewthing/archive/ 2007/12/03 / 6644060.aspx
[Windows编程,]为什么被称为没有应用程序的入口点 主要?那么,对于一两件事,这个名字主要是已被使用,并 窗户没有保留备用定义的权限。 有没有C语言标准化委员会当时的; C组 丹尼斯说,这是,这是很难保证丹尼斯 将采取什么特别的措施来保护Windows源代码 在C语言中的任何未来版本的兼容性。由于K&R 没有指定的实现可以扩展可接受的形式 主要功能,这是完全有可能的,有法律 C编译器是否决了宣主不正确的程序。该 当前的C语言标准明确允许执行特定的 为主要替代定义,但要求所有的编译器支持 为了编译Windows程序这个新的Windows的特定版本 将无偿限制设定,你可以使用编译器 编写Windows程序。
如果你成功地克服了这一障碍,你有问题 主要的Windows版本必须是这样的:
int main(int argc, char *argv[], HINSTANCE hinst, HINSTANCE hinstPrev, int nCmdShow);
由于进行C链接的方式,函数的所有变体必须在同意 参数他们有共同点。这意味着Windows版本 本来它的参数添加到的现存时间最长的结束 主要版本,然后你不得不用你的手指和希望 该C语言从未被添加的主要另一个替代版本。如果 你去这条路线,你的手指穿过你失败,因为它变成 指出,第三个参数添加到主一段时间后,它 发生冲突与您的Windows的版本。
假设你设法说服丹尼斯不要允许 三参数版本的主。你还是要拿出那些 前两个参数,这意味着每个程序的启动代码 需要包含一个命令行分析器。早在16位的天, 人省吃俭用节省每一个字节。告诉他们,“哦,你所有的 节目将是2KB做大”可能不会让你一个不少 的朋友。我的意思是,这就是I / O关软盘四个行业!
但也许就是为什么被赋予Windows的入口点原因 不同的名称,是为了强调,这是一个不同的执行 环境。如果它被称为主,人们会采取C程序 专为控制台环境,把他们变成自己的Windows 编译器,然后运行它们,具有灾难性的后果。
希望这会清除你的疑惑。
它的工作原理的其他方式。有附带保存实际的切入点,编译器静态链接的目标文件。该入口点确实初始化,然后调用的入口点(即WinMain中)。
什么静态部分期望呼叫可以被tweakable。例如,在Visual Studio中有一个为入口点名称的字段在链接设置。