带窗口的c ++-winrt main()方法应具有什么签名?

时间:2018-07-16 15:17:19

标签: c++-winrt

我已经打开了一个带有main()的c ++-winrt应用程序窗口,如下所示:

int main() {
    Application::Start([](const ApplicationInitializationCallbackParams&) {
        new CWindowsPlatformApp();
    });
}

winrt :: Windows :: UI :: Xaml :: ApplicationT的CWindowsPlatformApp继承。但是,在编译时出现如下链接错误:

vccorlibd.lib(climain.obj) : error LNK2019: unresolved external symbol "?main@@YAHP$01$AAV?$Array@P$AAVString@Platform@@$00@Platform@@@Z" (?main@@YAHP$01$AAV?$Array@P$AAVString@Platform@@$00@Platform@@@Z) referenced in function "int __cdecl _main(void)" (?_main@@YAHXZ)

main的CX签名仍然有效,但是我目前正在将所有CX代码转换为c ++-winrt。

int __cdecl main(Platform::Array<Platform::String^>^)

如果我将子系统更改为控制台应用程序,它也可以正确链接。

但是无论如何,我可以使用c ++-winrt指定Windows app-main()吗?

2 个答案:

答案 0 :(得分:4)

图形Windows应用程序的传统入口点功能为WinMain

#include <windows.h>

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
}

这里是complete example using C++/WinRT

答案 1 :(得分:3)

如果您打开vcxproj文件,则会看到此属性分配:

<AppContainerApplication>true</AppContainerApplication>

AppContainerApplication不是一个好名字的属性,因为它结合了应用程序包含和语言选择(C ++ / CX)。它同时启用了/ ZW(C ++ / CX)编译器开关,并使链接器使用C ++ / CX CRT库vccorlib(d).lib,该库定义了应用程序的入口点,进而导致链接错误。

在迁移到本机项目时,需要禁用这两个功能。您可以尝试在项目中逐步执行此操作。但是最简单的隔离是在项目边界。例如,您不能编译ISO C ++和C ++ / CX源文件可包含的#个pch。我建议将所有C ++ / CX代码移动到具有自己的pch和AppContainerApplication = true的静态库中,并使用本机main()和AppContainerApplication = false将其链接到您的主应用程序项目中。