1

我使用 Visual Studio Tools for Office (VSTO) 创建了一个 office:word 插件。我已将加载项的加载行为修改为“0”以停止其自动加载行为。

我的要求是从 ac# 应用程序启动一个 word 文档,并仅为这个 word 实例启用加载项。

Using Word = Microsoft.Office.Interop.Word;

{
  Word.Application wordApp;

  //Instantiate a word application
  wordApp = new Word.Application();
  wordApp.visible = true;

  // Open a document
  wordApp.Documents.Open(ref wordFile, ref Missing.value, ..... etc );  

  foreach (Word.AddIns addins in wordApp.Application.AddIns)
       MessageBox.Show(addins.ToString());
}

for 循环抛出异常:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Word.AddIn'  

* 如何获取/存储/迭代插件/COMaddins 列表 *

问候,

4

2 回答 2

0

最后我找到了解决我的问题的方法:

// This will return all the word addins
Microsoft.Office.Core.COMAddIns comAddins = wordApp.COMAddIns;

// Iterate through all the addins 
for(Microsoft.Office.Core.COMAddIns addins in wordApp.COMAddIns)
     MessageBox.Show(addin.Description);
于 2013-02-04T09:38:05.810 回答
0

众所周知,应用程序级插件适用于特定应用程序的所有实例。我成功地为 Office 2007(Word 和 Excel)应用程序的特定实例启用了应用程序级加载项。例如,如果我从 ac# 应用程序启动一个 word 实例,我的应用程序级加载项(自定义功能区功能)将仅适用于该实例,手动启动的所有其他实例的行为将是正常的。

每个应用程序级别的加载项都会在注册表中注册自己。因此,应用程序的每个实例都会尝试加载加载项。因此,主要的工作在于加载功能区。

在运行时,您必须决定是加载自定义功能区还是加载基本功能区。

为此,
-> 在 c# 应用程序中创建一个进程特定的环境变量,您将在其中实例化您的办公应用程序(word/excel)。

System.Environment.SetEnvironmentVariable("MyVar", "1", EnvironmentVariableTarget.Process);  

-> 检查加载项功能区类中的变量。如果变量存在则加载自定义功能区,如果不存在则加载基本功能区。

public string GetCustomUI(string ribbonID)
{
   if (System.Environment.GetEnvironmentVariable("MyVar", EnvironmentVariableTarget.Process) == "1")
   {
        return GetResourceText("ExcelAddIn.ExcelRibbon.xml");
   }
   else
   {
        return GetResourceText("ExcelAddIn.BasicRibbon.xml");
   }
}

你快完成了!但是 Windows 不允许您一次维护两个 word/excel 实例 (.exes)。因此,每个 word/excel 实例都将从同一个 .EXE 打开,并且您的加载项将应用于所有实例。因此,将 word/excel 的每个实例 (.exe) 分开。

有注册表破解来实现这一点:
在密钥中,

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open\Command

将“%1”附加到默认键值并重命名命令键。
在关键,

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open

重命名 ddeexec 键。

问候,

于 2013-02-21T07:01:27.820 回答