Ошибка создания COM-объекта повышенного уровня в Windows Seven

Я разрабатываю COM-суррогат объект на C, он будет использоваться моими приложениями для вызова диалога повышения прав UAC для определенных действий, требующих административных прав.

Планируется, что он будет экспортировать функцию, которая принимает указатель на функцию с переменным числом аргументов и выполняет ее в другом контексте. Таким образом, приложение может использовать этот объект для выполнения некоторых действий с правами администратора, все, что им нужно сделать, это использовать этот объект и передать ему указатель на функцию, которая должна быть выполнена с указанными правами.

Это работает частично, вызов CoCreateInstance проходит нормально, указатель на функцию передается и моя функция выполняется. Однако, когда я создаю экземпляр этого объекта с помощью CoCreateInstanceAsAdmin , возникают проблемы; вот код:


HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
 // Manual implementation of CreateInstanceAsAdmin
 CComPtr BindCtx;
 HRESULT hr = CreateBindCtx(0,&BindCtx);
 BIND_OPTS3 bo;
 memset(&bo, 0, sizeof(bo));
 bo.cbStruct = sizeof(bo);
 bo.grfMode = STGM_READWRITE;
 bo.hwnd = hwnd;
 bo.dwClassContext = CLSCTX_LOCAL_SERVER;
 hr = BindCtx->SetBindOptions(&bo);
 if (SUCCEEDED(hr))
 {
  // Use the passed in CLSID to help create the COM elevation moniker string
  CComPtr Moniker;
  WCHAR wszCLSID[50];
  WCHAR wszMonikerName[300];
  StringFromGUID2(rclsid,wszCLSID,sizeof(wszCLSID) / sizeof(wszCLSID[0]));
  //Elevation:Administrator!new
  hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID);
  if (SUCCEEDED(hr))
  {
   // Create the COM elevation moniker
   ULONG ulEaten = 0;
   ULONG ulLen = (ULONG)wcslen(wszMonikerName);
   LPBC pBindCtx = BindCtx.p;
   hr = MkParseDisplayName(pBindCtx,wszMonikerName,&ulEaten,&Moniker);
   if (SUCCEEDED(hr) && ulEaten == ulLen)
   {
    // Use passed in reference to IID to bind to the object
    IDispatch * pv = NULL;
    hr = Moniker->BindToObject(pBindCtx,NULL,riid,ppv);
   }
  }
 }
 return hr;
}

Вызов CoCreateInstanceAsAdmin завершается ошибкой с "

Может кто-нибудь пролить свет на эту тему? Возможно, то, что я пытаюсь достичь, невозможно по замыслу?

12
задан Benjamin 7 July 2014 в 11:12
поделиться