Какую подпись должен иметь оконный метод c ++ - winrt main ()?

У меня есть оконное приложение c ++ - winrt с main (), которое выглядит так:

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

CWindowsPlatformApp наследуется от winrt :: Windows :: UI :: Xaml :: ApplicationT. Однако при компиляции я получаю такую ​​ошибку компоновщика:

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)

CX-подпись main все еще работает, но в настоящее время я конвертирую весь CX-код в c ++ - winrt.

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

Если я изменю подсистему на консольное приложение, она также будет правильно связываться.

Но могу ли я указать приложение Windows app-main () с помощью c ++ - winrt?


person Mo0gles    schedule 16.07.2018    source источник


Ответы (2)


Если вы взломаете файл vcxproj, вы увидите это назначение свойств:

<AppContainerApplication>true</AppContainerApplication>

AppContainerApplication не является хорошо названным свойством, поскольку оно сочетает в себе включение приложения с выбором языка (C ++ / CX). Он включает переключатель компилятора / ZW (C ++ / CX) и заставляет компоновщик использовать библиотеку C ++ / CX CRT, vccorlib (d) .lib, которая определяет точку входа приложения и, в свою очередь, вызывает ошибку ссылки.

При переходе на собственный проект вам необходимо отключить обе эти функции. Вы можете попробовать делать это постепенно в своем проекте. Но самая простая изоляция - на границе проекта. Например, вы не можете скомпилировать один pch, который #includable как исходными файлами ISO C ++, так и C ++ / CX. Я бы предложил переместить весь ваш код C ++ / CX в статическую библиотеку с собственным pch и AppContainerApplication = true и связать это с вашим основным проектом приложения с помощью native main () и AppContainerApplication = false.

person Scott Jones    schedule 21.07.2018

Традиционной функцией точки входа для графического приложения Windows является WinMain:

#include <windows.h>

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

Вот полный пример с использованием C ++ / WinRT.

person Kenny Kerr    schedule 16.07.2018
comment
У меня есть несколько шаблонов, включая C ++ / WinRT, доступных на GitHub, которые могут быть вам полезны для ссылки. - person Chuck Walbourn; 16.07.2018