写在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中有一个为入口点名称的字段在链接设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top