Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Аннотация
В этой пошаговой статье показано, как создать клиент Microsoft Visual C# 2005 или Microsoft Visual C# .NET, который получает ссылку службы автоматизации на работающий экземпляр программы Office.
Создание приложения Visual C# 2005 или Visual C# .NET, которое автоматизирует работающий экземпляр программы Office
Клиентские программы, которые автоматизируют Office, могут либо создать новый экземпляр этой программы Office, либо получить ссылку на уже запущенный экземпляр. Корпорация Майкрософт обычно рекомендует создать новый экземпляр вместо подключения к работающему экземпляру. Однако в некоторых сценариях клиентская программа должна автоматизировать уже запущенный экземпляр программы Office. В этом случае клиент службы автоматизации получает ссылку на объект модели COM сервера автоматизации из запущенной таблицы объектов (ROT).
Если сервер службы автоматизации зарегистрировал себя в работающей таблице объектов, клиент .NET может получить ссылку на работающий экземпляр, вызвав следующую команду:
System.Runtime.InteropServices.Marshal.GetActiveObject
-или-
System.Runtime.InteropServices.Marshal.BindToMoniker
Пример кода
Запустите Microsoft Visual Studio 2005 или Microsoft Visual Studio .NET. В меню Файл выберите команду Создать, а затем выберите Проект. В разделе "Типы проектов" щелкните "Проекты Visual C#", а затем в разделе "Шаблоны" выберите пункт "Приложение Windows". Form1 создается по умолчанию.
Примечание В Visual C# 2005 щелкните Visual C# вместо проектов Visual C#.
Добавьте ссылку на библиотеку объектов Microsoft Excel и библиотеку объектов Microsoft Word. Для этого выполните следующие действия:
On the Project menu, click Add Reference.
На вкладке COM найдите библиотеку объектовMicrosoft Excel и нажмите кнопку "Выбрать".
Примечание В Visual C# 2005 не нужно нажать кнопку "Выбрать".
Примечание Microsoft Office 2003 включает основные сборки взаимодействия (PIA). Microsoft Office XP не включает персональные данные, но их можно скачать.
Найдите библиотеку объектов Microsoft Word и нажмите кнопку "Выбрать".
Примечание В Visual C# 2005 не нужно нажать кнопку "Выбрать".
В диалоговом окне "Добавление ссылок" нажмите кнопку "ОК", чтобы принять выбранные параметры.
В меню "Вид" щелкните панель элементов, чтобы отобразить панель элементов. Добавьте три кнопки и текстовое поле в Form1. Введите текст для этих элементов управления следующим образом:
Идентификатор Текст button1 Получение ссылки на службу автоматизации для запуска экземпляра Excel button2 Получение справочника по службе автоматизации в Excel с помощью моникера файлов button3 Оболочка Word и получение ссылки на службу автоматизации Textbox1 Введите имя сохраненного XLS-файла. Задайте обработчики событий Click для элементов управления "Кнопка", как показано ниже.
- Дважды щелкните кнопку1 и выберите "Конструктор" в меню "Вид".
- Дважды щелкните кнопку 2 и выберите "Конструктор" в меню "Вид".
- Дважды щелкните кнопку3.
Добавьте следующий код в начало Файла Form1.cs после других операторов using:
using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
Добавьте следующий код в обработчики событий:
private void button1_Click(object sender, System.EventArgs e) { //Excel Application Object Excel.Application oExcelApp; this.Activate(); //Get reference to Excel.Application from the ROT. oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); //Display the name of the object. MessageBox.Show(oExcelApp.ActiveWorkbook.Name); //Release the reference. oExcelApp = null; } private void button2_Click(object sender, System.EventArgs e) { Excel.Workbook xlwkbook; Excel.Worksheet xlsheet; //Get a reference to the Workbook object by using a file moniker. //The xls was saved earlier with this file name. xlwkbook = (Excel.Workbook) System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text); string sFile = textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1); xlwkbook.Application.Windows[sFile].Visible = true; xlwkbook.Application.Visible = true; xlsheet = (Excel.Worksheet) xlwkbook.ActiveSheet; xlsheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; xlsheet.Cells[1,1] = 100; //Release the reference. xlwkbook = null; xlsheet = null; } private void button3_Click(object sender, System.EventArgs e) { Word.Application wdapp; //Shell Word System.Diagnostics.Process.Start("<Path to WINWORD.EXE>"); this.Activate(); //Word and other Office applications register themselves in //ROT when their top-level window loses focus. Having a MessageBox //forces Word to lose focus and then register itself in the ROT. MessageBox.Show("Launched Word"); //Get the reference to Word.Application from the ROT. wdapp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application"); //Display the name. MessageBox.Show(wdapp.Name); //Release the reference. wdapp = null; }
Примечание В button3_click() замените Путь на Winword.exe правильным путем к Winword.exe. По умолчанию для Microsoft Word используется папка C:\Program Files\Microsoft Office\Office\Winword.exe.
В меню "Сборка" выберите "Собрать решение", чтобы создать приложение.
Тестирование приложения
- Нажмите клавишу F5, чтобы выполнить сборку и запуск приложения.
- Завершите работу всех запущенных экземпляров Excel.
- Запустите Excel с новой книгой.
- Нажмите кнопку "Получить ссылку на службу автоматизации" для запуска экземпляра Excel .
- Приложение получает ссылку службы автоматизации на существующий экземпляр Excel. Справочник по службе автоматизации хранится в локальной переменной oExcelApp для button1_Click. В окне сообщения отображается имя активной книги.
- Сохраните книгу на локальном диске. Оставьте книгу открытой в Excel.
- Введите полный путь и имя файла книги, сохраненной на предыдущем шаге, в textBox1.
- Нажмите кнопку "Получить ссылку на службу автоматизации в Excel" с помощью кнопки "Моникер файлов".
- Приложение получает ссылку службы автоматизации на работающий экземпляр Excel. Справочник по автоматизации хранится в локальной переменной xlwkbookfor button2_Click. Значение 100 вводится в первую строку и первый столбец активного листа.
- Закройте Excel, не сохраняя изменения в книге.
- Нажмите кнопку "Получить ссылку на службу автоматизации в Excel" с помощью кнопки "Моникер файлов".
- Создается новый экземпляр Excel, и открывается ранее сохраненная книга. Приложение получает ссылку службы автоматизации на этот экземпляр Excel. Справочник по автоматизации хранится в локальной переменной xlwkbook для button2_Click. Значение 100 вводится в первую строку и первый столбец активного листа.
- Закройте Excel.
- Щелкните оболочку Word и нажмите кнопку "Получить ссылку на службу автоматизации ".
- Word запускается так же, как если бы вы запустили его из командной строки, и отобразит окно сообщения "Запущено Word". При отображении окна сообщения WM_SETFOCUS отправка сообщения в окно программы Word. Это позволяет Word зарегистрировать себя в запущенной таблице объектов (ROT).
- Закройте окно сообщения. Программа получает ссылку службы автоматизации на только что запущенный экземпляр Word. Ссылка на службу автоматизации хранится в локальной переменной wdapp для button3_Click. Отобразится окно сообщения с именем объекта Word.Application.
Дополнительные примечания
COM-серверы можно классифицировать как многопользовательские (один экземпляр) или однократное использование (несколько экземпляров) в зависимости от количества экземпляров этого сервера, которые могут выполняться одновременно на одном компьютере.
Когда запрос на новый COM-объект поступает на COM-сервер с несколькими экземплярами, сервер использует только один экземпляр файла .exe для создания этого объекта. Независимо от того, сколько клиентов запрашивает новый COM-объект, в .exe будет только один сервер. На сервере с одним использованием (несколько экземпляров) каждый запрос нового COM-объекта запускает отдельный экземпляр сервера .exe файла. Таким образом, несколько экземпляров сервера могут работать на одном компьютере.
Несколько экземпляров Word (Winword.exe), Excel (Excel.exe) и Microsoft Access (MSAccess.exe) могут выполняться одновременно. Таким образом, эти серверы определяются как серверы с одним использованием (несколько экземпляров). В любой момент времени может выполняться только один экземпляр PowerPoint (Powerpnt.exe). Таким образом, PowerPoint является многопользовательским сервером (один экземпляр).
Независимо от того, является ли COM-сервер однопользовательским (несколько экземпляров) или многопользовательским (один экземпляр), может повлиять на ваше решение использовать GetActiveObject для получения ссылки на этот сервер. Так как может быть запущено несколько экземпляров Word, Excel или Microsoft Access, GetActiveObject на определенном сервере может вернуть экземпляр, который вы не ожидали. Экземпляр, который впервые зарегистрирован в ROT, обычно представляет собой экземпляр, возвращаемый GetActiveObject. Если вы хотите получить ссылку службы автоматизации на конкретный работающий экземпляр Word, Excel или Microsoft Access, используйте BindToMoniker с именем файла, открытого в этом экземпляре. Для сервера с несколькими экземплярами, например PowerPoint, это не имеет значения, так как ссылка на автоматизацию указывает на один и тот же работающий экземпляр.
Com-серверы должны регистрироваться в запущенной таблице объектов после запуска. Программы Office регистрируются самостоятельно, когда теряют фокус. Если программа пытается подключиться к работающему экземпляру до того, как программа потеряет фокус, может появиться сообщение об ошибке.
Ссылки
Чтобы получить дополнительные сведения о различных действиях программ Office при использовании GetActiveObject, щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:
288902 info: GetObject and CreateObject Behavior of Office Automation Servers For more information, see the following Microsoft Developer Network (MSDN) web site: