0

私は VS2008 を使用して Excel 2007 アドインを開発しています。アドイン内でアクティベーション コンテキスト API を使用して COM クラスをインスタンス化したいと考えています。

奇妙なことに、Windows 7 では COM クラスを正常にインスタンス化できますが、Windows XP/2003 では buf が失敗します。

ここにコードスニペットがあります

  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 では、アドインが lpAssemblyDirectory で指定したディレクトリではなく、c:\program files\microsoft Office\Office 12 で ComViewer.dll を検索することがわかりました。

誰でも助けることができますか?前もって感謝します。

4

1 に答える 1

2

XP / 2003では、lpSourceが指すルートマニフェスト内にCOMファイル情報を配置した場合、Activation Context APIはlpAssemblyDirectoryを尊重しないことを理解してください。この場合、Windowsは実行可能ファイルが存在するディレクトリ内のCOMファイルのみを検索します。

回避策は、元のマニフェスト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にも要素を追加する必要があります。

于 2010-08-03T13:08:08.920 に答える