Не удалось использовать API-интерфейс активации из надстройки Excel 2007 в Windows XP / 2003? - PullRequest
0 голосов
/ 29 июля 2010

Я использую VS2008 для разработки надстройки Excel 2007, в рамках надстройки я хочу использовать API-интерфейс активации для создания экземпляра класса COM.

Странная вещь в том, что я могу успешно создать экземпляр класса COM наОкно 7, сбой buf в Windows XP / 2003.

Вот фрагмент кода

  string codeBase = this.GetType().Assembly.CodeBase;
  string asmFullPath = new Uri(codeBase).LocalPath;
  string comAssemblyPath = Path.GetDirectoryName(asmFullPath);

  ACTCTX ac = new ACTCTX();
  ac.cbSize = Marshal.SizeOf(typeof(ACTCTX));
  ac.lpAssemblyDirectory = comAssemblyPath;
  ac.lpSource = Path.Combine(comAssemblyPath, "ComViewer.x.manifest");
  ac.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;

  IntPtr cookie;
  IntPtr hActCtx = CreateActCtxW(ref ac);
  if (ActivateActCtx(hActCtx, out cookie))
  {
    try
    {
      //instantiate COM class
      IComViewer = new ComViewerClass();

    }
    finally
    {
      DeactivateActCtx(0, cookie);
    }
  }
  else
  {
    //TODO: Error message.
  }

COM написан на C ++, а манифест выглядит так:

В Windows 2003 / XP я обнаружил, что надстройка ищет ComViewer.dll в каталоге c: \ program files \ microsoft Office \ Office 12, а не в каталоге, указанном в lpAssemblyDirectory.

Anyoneможет помочь?заранее спасибо.

1 Ответ

2 голосов
/ 03 августа 2010

Просто выясните, что в XP / 2003 API-интерфейс активации не учитывает lpAssemblyDirectory, если вы поместите информацию COM-файла в корневой манифест, на который указывает lpSource, в этом случае Windows будет искать только COM-файл в каталоге, в котором находится исполняемый файл дюймы

Обходной путь - создать еще один mainfest, который зависит от исходного манифеста ComViewer.x.manifest, и передать его в lpSource. В приведенном выше примере вы можете передать следующий манифест:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity name="ComViewer.x" >
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

Конечно, вы также должны добавить элемент в ComViewer.x.manifest.

...