0

Я использую IApplicationActivationManager :: ActivateApplication() из MSDN ActivateApplication API2-й параметра "Аргументы" от IApplicationActivationManager :: ActivateApplication() Синтаксис

написать консольное приложение EXE (VC++), который запускает «Фото приложения метро & дисплеев PNG-изображение ". Вот фрагмент кода. Он активирует приложение «Photos metro», но не может отображать изображение с помощью приложения «Фотографии».

CoInitializeEx(NULL, COINIT_MULTITHREADED); 
    LPCWSTR appId = L"Microsoft.Windows.Photos_8wekyb3d8bbwe!App"; 
    LPCWSTR imageArg = L" C:\\data\\Users\\Public\\Pictures\\image123.png"; 
    IApplicationActivationManager* paam = NULL; 
    HRESULT hr = E_FAIL; 

    __try 
    { 
     hr = CoCreateInstance(CLSID_ApplicationActivationManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&paam)); 
     if (FAILED(hr)) 
     { 
      cout << "Error creating CoCreateINstance & HR is" <<hr<< endl; 
      return 0; 
     } 

     DWORD pid = 0; 
     hr = paam->ActivateApplication(appId, imageArg, AO_NONE, &pid); 
     if (FAILED(hr)) 
     { 
      cout << "Error in ActivateApplication call & HR is " <<hr<< endl; 
      return 0; 
     } 

     cout << hex << hr; 
     if (hr == 0) 
      wprintf(L"Activated %s with pid %d\r\n", appId, pid); 
    } 
    __finally 
    { 
     if (paam) paam->Release(); 
    } 

    CoUninitialize(); 

Я уверен, что ошибка во 2-й аргумент функции «ActivateApplication()», где я даю аргумент. Я пробовал разные способы, давая аргументы, как:

LPCWSTR imageArg = L " C: \ Data \ Users \ Public \ Pictures \ image123.png"; ИЛИ
LPCWSTR imageArg = L "- C: \ data \ Users \ Public \ Pictures \ image123.png";
LPCWSTR imageArg = L "C: \ data \ Users \ Public \ Pictures \ image123.png";

+0

Да, я действительно использовал «\\». – codeLover

+0

Ваша программа заканчивается слишком быстро, делая строку недействительной к тому времени, когда целевое приложение будет готово получить аргумент командной строки. Вместо этого вы должны использовать CLSCTX_LOCAL_SERVER. Всегда объясняйте, что вы * действительно хотите достичь, когда задаете вопрос, таким образом, вы, скорее всего, получите необходимую помощь. И прочитайте лицензию сайта, здесь требуется атрибуция. –

+0

Я попытался использовать CLSCTX_LOCAL_SERVER, но на этот раз он не работает в CoCreateInstance(). – codeLover

ответ

1

Чтобы выполнить активацию файла, используйте метод IApplicationActivationManager::ActivateForFile.

Вы можете создать ShellItem из файла пути с SHCreateItemFromParsingName (путем этим именем синтаксическим) и могут создать ShellItemArray от с SHCreateShellItemArrayFromShellItem

приложением Фото не будете слушать имя файла на ActivateApplication-х аргумент активации, и он не имел бы доступ к файлу по пути, если бы это произошло. Метод ActivateForFile преобразует переданные в ShellItems файлы StorageFiles, которые несут разрешения, позволяющие приложению открывать их.

+0

Не могли бы вы помочь с фрагментом кода? и дать некоторые основы тому, что представляют собой эти элементы оболочки и их интерфейсы? – codeLover

+0

Я не рядом с машиной dev и не могу предоставить фрагмент кода с моего телефона. Это должно быть прямо из документов, которые я все готов связать: вызовите SHCreateShellItemFromParsingName, чтобы получить ShellItem, затем ShCreateShellItemArray, чтобы создать массив из него. Попробуй, тогда возвращайся с вопросами после этого. У вас все будет хорошо, прежде чем я смогу написать код –

+0

@Rob Caplan: у меня возникла проблема с вызовом приложения «Фото», используя IApplicationActivationManager :: ActivateForFile таким образом, который в значительной степени идентичен тому, что вы описали здесь. Если у вас есть шанс, можете ли вы взглянуть на http://stackoverflow.com/questions/35395035/error-opening-file-in-win10-modern-app-launched-from-desktop-c? Благодаря! – chrisd