Код статьи: 316126 - Последнее изменение :: 19 января 2006 г. - Редакция: 5.2

Автоматизация запущенного экземпляра приложения Office с помощью Visual C# .NET

Совет по использованию системыЭта статья относится к операционной системе, отличной от установленной на вашем компьютере. Содержимое, не относящееся к используемой системе, отключено.

На этой странице

Развернуть все | Свернуть все

Аннотация

В статье описан процесс создания с помощью Visual C# .NET программы, которая получает ссылку автоматизации на запущенный экземпляр приложения Office.


Создание в среде Visual C# .NET программы для автоматизации запущенного экземпляра приложения Office

В случае автоматизации Office клиентская программа либо создает новый экземпляр приложения, либо получает ссылку на уже существующий. Как правило, корпорация Microsoft рекомендует использовать первый вариант. Однако в определенных ситуациях возникает необходимость автоматизации уже запущенного экземпляра приложения Office. В этом случае клиент автоматизации получает из таблицы ROT (Running Object Table) ссылку на COM-объект сервера автоматизации.

Если сервер автоматизации зарегистрирован в таблице ROT, клиент .NET для получения ссылки на запущенный экземпляр приложения делает следующий вызов:
System.Runtime.InteropServices.Marshal.GetActiveObject

или

System.Runtime.InteropServices.Marshal.BindToMoniker

Пример программы

  1. Запустите Microsoft Visual Studio .NET. В меню Файл выберите команду Создать, а затем — Проект. В списке Типы проектов выберите проект Проекты Visual C#, а затем в разделе Шаблоны — элемент Приложение Windows. По умолчанию будет создана форма Form1.
  2. Добавьте ссылки на объектные библиотеки Microsoft Excel Object Library и Microsoft Word Object Library. Для этого необходимо выполнить следующие действия.
    1. Выберите в меню Проект команду Добавить ссылку.
    2. На вкладке COM выделите библиотеку Microsoft Excel Object Library и нажмите кнопку Выбрать.

      Примечание. В состав Microsoft Office 2003 входят основные сборки взаимодействия (PIA). Microsoft Office XP не включает эти сборки, но их можно загрузить. За дополнительными сведениями об основных сборках взаимодействия (PIA) для Office XP обратитесь к следующей статье Microsoft Knowledge Base:
      328912  (http://support.microsoft.com/kb/328912/RU/ ) INFO: Microsoft Office XP PIAs Are Available for Download
    3. Выделите библиотеку Microsoft Word Object Library и нажмите кнопку Выбрать.
    4. Для подтверждения сделанного выбора нажмите кнопку OK в диалоговом окне Добавление ссылки.
  3. Для отображения панели инструментов выберите в меню Вид команду Область элементов. Добавьте в форму Form1 три кнопки и текстовое поле. Введите для этих элементов управления следующие названия.
       Идентификатор    Название
       --------         ---------
       button1          Получить ссылку автоматизации на запущенный экземпляр Excel
       button2          Получить ссылку автоматизации на экземпляр Excel с помощью специального имени файла
       button3          Запустить Word и получить на него ссылку автоматизации
       textBox1         Указать имя сохраненного файла с расширением XLS
    					
  4. Чтобы определить для каждой кнопки обработчик события Click, выполните следующие действия.
    1. Дважды щелкните кнопку button1 и выберите в меню Вид пункт Конструктор.
    2. Дважды щелкните кнопку button2 и выберите в меню Вид пункт Конструктор.
    3. Дважды щелкните кнопку button3.
  5. В верхней части файла Form1.cs в конце блока инструкций using добавьте следующие строки.
    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    					
  6. Добавьте в обработчики событий приведенный ниже программный код.
    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() подставьте вместо слов Path to Winword.exe реальный путь к файлу Winword.exe. По умолчанию он располагается в папке C:\Program Files\Microsoft Office\Office.

  7. Для создания программы выберите в меню Построение команду Построить решение.

Проверка приложения

  1. Для создания и запуска приложения нажмите клавишу F5.
  2. Закройте все запущенные экземпляры Excel.
  3. Откройте новую книгу Excel.
  4. Нажмите кнопку Получить ссылку автоматизации на запущенный экземпляр Excel.
  5. Программа получит ссылку автоматизации на запущенный экземпляр Excel. Эта ссылка хранится в локальной переменной oExcelApp функции button1_Click. Будет отображено диалоговое окно с названием рабочей книги.
  6. Сохраните книгу на жестком диске и оставьте ее открытой.
  7. В поле textBox1 введите полное имя (включая путь) сохраненной книги.
  8. Нажмите кнопку Получить ссылку автоматизации на экземпляр Excel с помощью специального имени файла.
  9. Программа получит ссылку автоматизации на запущенный экземпляр Excel. Эта ссылка хранится в локальной переменной xlwkbook функции button2_Click. В ячейку на пересечении первой строки и первого столбца записывается значение 100.
  10. Закройте Excel без сохранения изменений.
  11. Нажмите кнопку Получить ссылку автоматизации на экземпляр Excel с помощью специального имени файла.
  12. Будет создан новый экземпляр Excel и открыта ранее сохраненная книга. Программа получит ссылку автоматизации на этот экземпляр Excel. Эта ссылка хранится в локальной переменной xlwkbook функции button2_Click. В ячейку на пересечении первой строки и первого столбца записывается значение 100.
  13. Закройте Excel.
  14. Нажмите кнопку Запустить Word и получить на него ссылку автоматизации.
  15. Будет запущен Word и появится сообщение Launched Word. В результате вывода этого сообщения окну программы Word будет отправлено сообщение WM_SETFOCUS. Благодаря этому Word регистрируется в таблице ROT.
  16. Закройте окно сообщения. Программа получит ссылку автоматизации на созданный экземпляр Word. Эта ссылка хранится в локальной переменной wdapp функции button3_Click. Появится сообщение с именем объекта Word.Application.

Дополнительные замечания

В зависимости от количества экземпляров сервера COM, которые могут быть запущены на компьютере одновременно, различают серверы многопользовательские (один экземпляр) и однопользовательские (несколько экземпляров)

Когда запрос на новый СОМ-объект поступает многопользовательскому серверу, то для создания такого объекта используется только один экземпляр файла ЕХЕ. Независимо от того, сколько клиентов запрашивают новый СОМ-объект, существует только один процесс сервера (файл ЕХЕ). Однопользовательский сервер для каждого запроса на новый СОМ-объект запускает отдельный экземпляр файла ЕХЕ сервера. Таким образом, на одном компьютере может быть одновременно запущено несколько экземпляров сервера.

Несколько экземпляров программ Word (файл Winword.exe), Excel (файл Excel.exe) и Access (файл MSAccess.exe) могут быть запущены одновременно. Следовательно, они относятся к однопользовательским (несколько экземпляров) серверам. В определенный момент времени может быть запущен только один экземпляр программы PowerPoint (файл Powerpnt.exe). Следовательно, PowerPoint является многопользовательским (один экземпляр) сервером.

Решение использовать метод GetActiveObject для получения ссылки на сервер СОМ зависит от типа сервера. Поскольку одновременно может быть запущено несколько экземпляров Word, Excel или Access, метод GetActiveObject может вернуть не тот экземпляр, который необходим. Как правило, метод GetActiveObject возвращает экземпляр, который был первым зарегистрирован в таблице ROT. Для получения ссылки автоматизации на определенный запущенный экземпляр Word, Excel или Access используется метод BindToMoniker с именем файла, который открыт в этом экземпляре. Для многопользовательского (один экземпляр) сервера (например, PowerPoint) могут быть использованы оба метода, поскольку ссылка автоматизации указывает на один и тот же запущенный экземпляр.

Серверы COM регистрируются в таблице RОТ автоматически в момент запуска. Приложения Office регистрируются после потери фокуса. Если программа пытается подключиться к запущенному экземпляру до потери фокуса, может появиться сообщение об ошибке. За дополнительной информацией о решении этой проблемы обратитесь к следующей статье Microsoft Knowledge Base:
316125  (http://support.microsoft.com/kb/316125/RU/ ) PRB: Visual C# .NET Error Attaching to Running Instance of Office Application

Ссылки

За дополнительной информацией о поведении различных программ Office в случае использования метода GetActiveObject обратитесь к следующей статье Microsoft Knowledge Base:
288902  (http://support.microsoft.com/kb/288902/RU/ ) INFO: GetObject and CreateObject Behavior of Office Automation Servers
За дополнительной информацией обратитесь на веб-узел Microsoft Developer Network (MSDN) по следующему адресу:
Использование Visual Studio для программирования Microsoft Office
http://msdn.microsoft.com/library/en-us/dnoxpta/html/vsofficedev.asp (http://msdn.microsoft.com/library/en-us/dnoxpta/html/vsofficedev.asp)

Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
Ключевые слова: 
kbpia kbautomation kbhowtomaster KB316126