Visual Basic에서 Office 2000 COM 추가 기능을 작성하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 238228 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR238228
모두 확대 | 모두 축소

이 페이지에서

요약

Microsoft Office 2000 이후 버전에서는 Office 응용 프로그램을 향상시키고 제어하는 응용 프로그램 추가 기능을 작성할 수 있는 새롭고 일관된 설계 아키텍처를 지원합니다. 이러한 추가 기능을 COM 추가 기능이라고 합니다. 이 문서에서는 Visual Basic을 사용하여 COM 추가 기능을 작성하는 방법을 보여 줍니다.

추가 정보

COM 추가 기능은 Microsoft 추가 기능 디자이너 형식 라이브러리(Msaddndr.dll)에 정의된 대로 IDTExensibility2 인터페이스를 구현하는 종속 프로세스 COM 서버(ActiveX DLL)입니다. 모든 COM 추가 기능은 이 인터페이스에서 상속되며 5가지 메서드를 구현해야 합니다.

OnConnection

OnConnection 이벤트는 COM 추가 기능이 연결될 때마다 발생합니다. 추가 기능은 시작할 때 자동으로 연결되거나 최종 사용자에 의해 연결됩니다. OnConnection이 성공적으로 반환되면 추가 기능이 로드된 것입니다. 오류가 반환되면 호스트 응용 프로그램은 즉시 추가 기능에 대한 참조를 해제하며 개체는 소멸됩니다.

OnConnection에는 다음 네 가지 매개 변수가 사용됩니다.
  • Application - 호스트 응용 프로그램 개체에 대한 참조
  • ConnectMode - 추가 기능을 연결하는 방법을 지정하는 상수
    • ext_cm_AfterStartup - COM 추가 기능 대화 상자에서 최종 사용자에 의해 시작
    • ext_cm_CommandLine - 명령줄에서 연결 (Office 응용 프로그램을 위한 COM 추가 기능을 작성하는 데 적용되지 않음)
    • ext_cm_External - 자동화를 통해 외부 응용 프로그램에 의해 연결 (Office 응용 프로그램을 위한 COM 추가 기능을 작성하는 데 적용되지 않음)
    • ext_cm_Startup - 응용 프로그램을 시작할 때 호스트에 의해 시작 (이 동작은 레지스트리의 설정에 의해 제어됨)
  • AddInInst - 호스트 응용 프로그램을 위한 COMAddIns 컬렉션에서 이 추가 기능을 참조하는 COMAddIn 개체에 대한 참조
  • Custom - 사용자 정의 데이터를 저장할 수 있는 Variant의 배열

OnDisconnection

OnDisconnection 이벤트는 COM 추가 기능에 대한 연결이 해제될 때와 메모리에서 언로드되기 직전에 발생합니다. 추가 기능은 이 이벤트에서 리소스를 비우고 호스트 응용 프로그램에 대한 변경을 복원해야 합니다.

OnDisconnection에는 다음 두 가지 매개 변수가 사용됩니다.
  • RemoveMode - 추가 기능에 대한 연결을 해제하는 방법을 지정하는 상수
    • ext_dm_HostShutdown - 호스트 응용 프로그램을 닫을 때 연결 해제
    • ext_dm_UserClosed - 최종 사용자나 자동화 컨트롤러에 의해 연결 해제
  • Custom - 사용자 정의 데이터를 저장할 수 있는 Variant의 배열

OnAddInsUpdate

OnAddInsUpdate 이벤트는 등록된 COM 추가 기능을 변경할 때 발생합니다. 즉, 호스트 응용 프로그램에서 COM 추가 기능을 설치하거나 제거할 때마다 이 이벤트가 실행됩니다.

OnStartupComplete 및 OnBeginShutdown

OnStartupComplete와 OnBeginShutdown 메서드는 메모리에 응용 프로그램이 로드되거나 언로드되는 과정이기 때문에 호스트 응용 프로그램이 사용자 상호 작용을 피해야 하는 상태에 들어갈 경우나 해당 상태인 경우에 호출됩니다. OnStartupComplete는 응용 프로그램 시작 중에 추가 기능이 연결된 경우에만 호출되며 OnBeginShutdown은 응용 프로그램 종료 중에 추가 기능이 호스트에 의해 연결이 해제된 경우에만 호출됩니다.

호스트 응용 프로그램의 사용자 인터페이스는 이러한 이벤트가 발생할 때 완전히 활성화되기 때문에 이벤트가 발생하지 않으면 OnConnection과 OnDisconnection에서 일부 동작을 수행할 수 없습니다.

COM 추가 기능 등록

COM 추가 기능은 일반적인 COM 등록 외에도 COM 추가 기능을 실행하는 각 Office 응용 프로그램에 등록되어야 합니다. 특정 응용 프로그램에 등록하려면 추가 기능은 키 이름으로 ProgID를 사용하여 다음 위치에 하위 키를 만들어야 합니다.
HKEY_CURRENT_USER\Software\Microsoft\Office\<OfficeApp>\Addins\<ProgID>
추가 기능은 친숙한 표시 이름과 전체 설명에 대한 값을 이 키 위치에 제공할 수 있습니다. 뿐만 아니라 추가 기능은 "LoadBehavior"라는 DWORD 값을 사용하여 원하는 로드 동작을 지정해야 합니다. 이 값은 다음을 조합하여 구성되며 호스트 응용 프로그램에서 추가 기능을 로드하는 방법을 결정합니다.
  • 0 = Disconnect - 로드되지 않음
  • 1 = Connected - 로드됨
  • 2 = Bootload - 응용 프로그램 시작 시 로드
  • 8 = DemandLoad - 사용자가 요청할 때만 로드
  • 16 = ConnectFirstTime - 한 번만(다음에 시작할 때) 로드
일반적으로 지정되는 값은 0x03(Connected | Bootload)입니다.

IDTExtensibility2를 구현하는 추가 기능은 "CommandLineSafe"라는 DWORD 값을 지정하여, 사용자 인터페이스를 지원하지 않는 동작에 대해 안전한지 여부를 나타내야 합니다. 0x00 값은 False, 0x01 값은 True를 의미합니다.

COM 추가 기능 작성

아래에서 설명하는 세 가지 방법 중 하나로 COM 추가 기능을 작성할 수 있습니다.

Com 추가 기능 템플릿을 사용하여 COM 추가 기능 작성

Microsoft Office 2000 Developer나 Microsoft Office XP Developer 및 Visual Basic 6.0이 설치되어 있는 경우 COM Add-in.vbp 템플릿을 사용하여 간단하게 COM 추가 기능을 작성할 수 있습니다. 이 프로젝트는 Office 2000 Developer CD의 ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn 하위 폴더에 있습니다. 이 폴더에 있는 파일을 Visual Basic 6.0 Template\Projects 폴더(일반적으로 C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects)로 복사합니다. 템플릿 프로젝트를 이 위치로 복사하면 템플릿이 Visual Basic 6.0 새 프로젝트 대화 상자에 나타납니다. 이 템플릿 및 COM 추가 기능 만들기에 대한 자세한 내용은 Microsoft Office 2000 Visual Basic Programmer's Guide의 11장을 참조하십시오.

Visual Basic 6 추가 기능 디자이너를 사용하여 COM 추가 기능 작성

Microsoft Visual Basic 6.0만 설치되어 있고 IDTExtensibility2를 직접 구현할 필요가 없도록 래퍼를 사용하려는 경우 VB6 추가 기능 구축에 사용되는 것과 동일한 추가 기능 디자이너를 사용할 수 있습니다. Microsoft Excel 2000 또는 2002를 위한 추가 기능을 구축하려면 다음 단계를 수행하십시오.
  1. Microsoft Visual Basic 6.0을 시작하고 프로젝트 형식으로 추가 기능을 선택합니다. 여기서 디자이너 클래스를 프로젝트(Connect)와 양식(frmAddin)에 추가해야 합니다.
  2. Connect에 대한 디자이너 창을 열고 응용 프로그램 드롭다운 목록에서 Microsoft Excel을 선택합니다.
  3. 초기 로드 동작 드롭다운 목록에서 시작을 선택합니다.
  4. 프로젝트에서 frmAddin을 제거합니다.
  5. 프로젝트 창에서 Connect 항목을 마우스 오른쪽 단추로 누르고 코드 보기를 선택합니다.
  6. 디자이너 코드 창에서 코드를 모두 제거합니다. 이 코드는 Office 추가 기능이 아닌 VB 추가 기능에서 작동합니다.
  7. 다음 코드를 디자이너에 추가합니다.
       Option Explicit
    
       Dim oXL As Object
       Dim WithEvents MyButton As Office.CommandBarButton
    
       Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
        ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
        ByVal AddInInst As Object, custom() As Variant)
          On Error Resume Next
          MsgBox "My Addin started in " & Application.Name
       
          Set oXL = Application
       
          Set MyButton = oXL.CommandBars("Standard").Controls.Add(1)
             With MyButton
                .Caption = "My Custom Button"
                .Style = msoButtonCaption
    
              ' The following items are optional, but recommended. 
              ' The Tag property lets you quickly find the control 
              ' and helps MSO keep track of it when there is more than
              ' one application window visible. The property is required
              ' by some Office applications and should be provided.
    
                .Tag = "My Custom Button"
     
              ' The OnAction property is optional but recommended. 
              ' It should be set to the ProgID of the add-in, such that if
              ' the add-in is not loaded when a user presses the button,
              ' MSO loads the add-in automatically and then raises
              ' the Click event for the add-in to handle. 
    
                .OnAction = "!<" & AddInInst.ProgId & ">"
    
                .Visible = True
             End With
       
       End Sub
    
       Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As _
          AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
          On Error Resume Next
          MsgBox "My Addin was disconnected by " & _
             IIf(RemoveMode = ext_dm_HostShutdown, _
             "Excel shutdown.", "end user.")
          
          MyButton.Delete
          Set MyButton = Nothing
          Set oXL = Nothing
        End Sub
    
       Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton, _
         CancelDefault As Boolean)
          MsgBox "Our CommandBar button was pressed!"
       End Sub
  8. 프로젝트를 저장하고 MyAddin.dll을 만듭니다. 디자이너가 사용자를 대신해 추가 기능을 등록합니다.
  9. Microsoft Excel을 열면 추가 기능을 로드할 때와 언로드할 때 메시지 상자가 나타납니다. 추가 기능을 선택하면 표준 도구 모음에 My Custom Button이라는 새 단추가 나타납니다.

Implements를 사용하여 COM 추가 기능 작성

간단하지는 않지만 Microsoft Visual Basic 5.0과 Implements 키워드를 사용하여 IDTExtensibility2 인터페이스를 직접 구현하는 COM 추가 기능을 만들 수 있습니다. 이 방법의 유일한 단점은 등록입니다. Microsoft Visual Basic은 Office에서 추가 기능을 등록하는 데 필요한 키를 추가하지 못하기 때문에 사용자가 별도(사용자 지정 설치 유틸리티 또는 REG 스크립트 사용)로 수행해야 합니다.

Implements를 사용하는 장점은 디자이너를 사용하는 것보다 더 직접적이고 효율적이며 작업하려는 각 응용 프로그램에 대해 별도의 Connect 개체를 만드는 대신 여러 Office 응용 프로그램에서 작동할 수 있는 단일 COM 개체를 만들 수 있다는 점입니다.

Implements를 사용하여 추가 기능을 작성하는 단계는 다음과 같습니다.
  1. Visual Basic을 열고 ActiveX DLL 프로젝트를 새로 만듭니다. 프로젝트 이름을 MyCOMAddin으로 지정하고 공용 클래스 이름을 Connect로 지정합니다.
  2. 참조 대화 상자(프로젝트 | 참조)에서 Microsoft Office 9.0(또는 Office XP의 경우 10.0) 개체 라이브러리와 Microsoft 추가 기능 디자이너 형식 라이브러리에 참조를 추가합니다. 참조 목록에서 추가 기능 디자이너를 찾을 수 없는 경우 "C:\Program Files\Common Files\Designer" 폴더에서 Msaddndr.dll 또는 Msaddndr.tlb를 찾아야 합니다.
  3. Connect의 코드 창에 다음을 추가합니다.
       Option Explicit
       Implements IDTExtensibility2
    
       Dim oHostApp As Object
       Dim WithEvents MyButton As Office.CommandBarButton
    
      Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _
         ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
    
         ByVal AddInInst As Object, custom() As Variant)
      
          On Error Resume Next
        ' Set a reference to the host application...
          Set oHostApp = Application
       
        ' If you aren't in startup, then manually call OnStartupComplete...
          If (ConnectMode <> ext_cm_Startup) Then _
             Call IDTExtensibility2_OnStartupComplete(custom)
          
       End Sub
    
       Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
          Dim oCommandBars As Office.CommandBars
          Dim oStandardBar As Office.CommandBar
       
          On Error Resume Next
        ' Set up a custom button on the "Standard" commandbar...
          Set oCommandBars = oHostApp.CommandBars
          If oCommandBars Is Nothing Then
           ' Outlook has the CommandBars collection on the Explorer object
             Set oCommandBars = oHostApp.ActiveExplorer.CommandBars
          End If
       
          Set oStandardBar = oCommandBars.Item("Standard")
          If oStandardBar Is Nothing Then
           ' Access names it's main toolbar Database
    
             Set oStandardBar = oCommandBars.Item("Database")
          End If
       
        ' In case the button was not deleted, use the exiting one...
          Set MyButton = oStandardBar.Controls.Item("My Custom Button")
             If MyButton Is Nothing Then
    
                Set MyButton = oStandardBar.Controls.Add(1)
                With MyButton
                   .Caption = "My Custom Button"
                   .Style = msoButtonCaption
     
              ' The following items are optional, but recommended. 
              ' The Tag property lets you quickly find the control 
              ' and helps MSO keep track of it when there is more than
              ' one application window visible. The property is required
              ' by some Office applications and should be provided.
    
                .Tag = "My Custom Button"
     
              ' The OnAction property is optional but recommended. 
              ' It should be set to the ProgID of the add-in, such that if
              ' the add-in is not loaded when a user presses the button,
              ' MSO loads the add-in automatically and then raises
              ' the Click event for the add-in to handle. 
    
                   .OnAction = "!<MyCOMAddin.Connect>"
    
                   .Visible = True
                End With
             End If
     
        ' Display a simple message to know which application you started in...
          MsgBox "Started in " & oHostApp.Name & "."
    
          Set oStandardBar = Nothing
          Set oCommandBars = Nothing
       End Sub
    
       Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As _
         AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    
          On Error Resume Next
          If RemoveMode <> ext_dm_HostShutdown Then _
             Call IDTExtensibility2_OnBeginShutdown(custom)
          
          Set oHostApp = Nothing
    
       End Sub
    
       Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
          On Error Resume Next
        ' Notify the user you are shutting down, and delete the button...
          MsgBox "Our custom Add-In is unloading."
          MyButton.Delete
          Set MyButton = Nothing
       End Sub
    
       Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton,    CancelDefault As Boolean)
          MsgBox "Our CommandBar button was pressed!"
       End Sub
    
       Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
          'You do nothing if this is called, but you need to
          'add a comment so Visual Basic properly implements the function...
       End Sub
  4. 프로젝트를 저장하고 MyCOMAddin.dll을 만듭니다. 그러나 추가 기능이 작동하려면 실행할 각 Office 응용 프로그램에 연결해야 합니다. 실제 DLL을 설치하면 설치 유틸리티가 이 작업을 수행할 수 있습니다. 이 예에서는 Visual Basic IDE에서 직접 등록 함수를 호출합니다.
  5. 새 모듈을 프로젝트에 추가합니다. Module1의 코드에 다음을 추가합니다.
       Option Explicit
    
       Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _
       Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
       ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As _
       Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, _
       phkResult As Long, lpdwDisposition As Long) As Long
       
       Private Declare Function RegSetValueEx Lib "advapi32.dll" _
       Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As _
       String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, _
       ByVal cbData As Long) As Long
       
       Private Declare Function RegDeleteKey Lib "advapi32.dll" _
       Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) _
       As Long
       
       Private Declare Function RegCloseKey Lib "advapi32.dll" _
       (ByVal hKey As Long) As Long
    
       Private Const HKEY_CURRENT_USER = &H80000001
       Private Const KEY_ALL_ACCESS = &H1F0037
       Private Const REG_CREATED_NEW_KEY = &H1
       Private Const REG_SZ = 1
       Private Const REG_DWORD = 4
    
       'These are the settings for your Add-in...
       Private Const PROGID As String = "MyCOMAddin.Connect"
       Private Const DESCRIPTION As String = "My VB5/6 COM Add-In Sample"
       Private Const LOADBEHAVIOR As Long = 3
       Private Const SAFEFORCOMMANDLINE As Long = 0
    
    
       Public Sub RegisterAll()
          RegisterOfficeAddin "Access"
          RegisterOfficeAddin "Excel"
          RegisterOfficeAddin "FrontPage"
          RegisterOfficeAddin "Outlook"
          RegisterOfficeAddin "PowerPoint"
          RegisterOfficeAddin "Word"
       End Sub
    
       Public Sub UnregisterAll()
          UnRegisterOfficeAddin "Access"
          UnRegisterOfficeAddin "Excel"
          UnRegisterOfficeAddin "FrontPage"
          UnRegisterOfficeAddin "Outlook"
          UnRegisterOfficeAddin "PowerPoint"
          UnRegisterOfficeAddin "Word"
       End Sub
    
       Public Sub RegisterOfficeAddin(sTargetApp As String)
          Dim sRegKey As String
          Dim nRet As Long, dwTmp As Long
          Dim hKey As Long
       
          sRegKey = "Software\Microsoft\Office\" & sTargetApp _
             & "\Addins\" & PROGID
       
          nRet = RegCreateKeyEx(HKEY_CURRENT_USER, sRegKey, 0, _
             vbNullString, 0, KEY_ALL_ACCESS, 0, hKey, dwTmp)
          
          If nRet = 0 Then
             If dwTmp = REG_CREATED_NEW_KEY Then
                Call RegSetValueEx(hKey, "FriendlyName", 0, _
                   REG_SZ, ByVal PROGID, Len(PROGID))
                Call RegSetValueEx(hKey, "Description", 0, _
                   REG_SZ, ByVal DESCRIPTION, Len(DESCRIPTION))
                Call RegSetValueEx(hKey, "LoadBehavior", 0, _
                   REG_DWORD, LOADBEHAVIOR, 4)
                Call RegSetValueEx(hKey, "CommandLineSafe", 0, _
                   REG_DWORD, SAFEFORCOMMANDLINE, 4)
             End If
             Call RegCloseKey(hKey)
          End If
       
       End Sub
    
       Public Sub UnRegisterOfficeAddin(sTargetApp As String)
          Dim sRegKey As String
          sRegKey = "Software\Microsoft\Office\" & sTargetApp _
             & "\Addins\" & PROGID
       
           Call RegDeleteKey(HKEY_CURRENT_USER, sRegKey)
       
       End Sub
  6. 직접 실행 창(보기 | 직접 실행 창)에 RegisterAll을 입력한 다음 Enter 키를 누릅니다. 지원되는 모든 Office 응용 프로그램(Access, Excel, FrontPage, Outlook, PowerPoint 및 Word)에 등록됩니다.
  7. 앞에 나열된 Office 응용 프로그램을 엽니다. 시작과 종료 시 메시지 상자와 표준 도구 모음에 추가된 사용자 지정 단추가 나타납니다.
  8. 추가 기능 등록을 취소하려면 Visual Basic 직접 실행 창에서 UnregisterAll을 입력한 다음 Enter 키를 누릅니다.

참조

"Microsoft Office 2000 Visual Basic Programmer's Guide"의 11장. 추가 기능, 템플릿, 마법사 및 라이브러리

COM 추가 기능 작성에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
230689 SAMPLE: Visual C++로 작성된 Comaddin.exe의 Office 2000 COM 추가 기능
190253 INFO: VB6 디자이너는 VB5에서 작동하지 않는다
Microsoft Internet Explorer의 웹 기반 솔루션 개발에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/ie/
참고 이 문서에 설명된 단계나 유사한 방법을 사용하여 Visual Basic COM 추가 기능에서 Office Word에 메뉴 항목을 추가하면 메뉴 항목이 제대로 작동하지 않습니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
313948 WD2002: Word에서 COM 개체 메뉴 항목(CommandBarControl)에 대한 참조가 손실된다




?Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 238228 - 마지막 검토: 2005년 10월 19일 수요일 - 수정: 6.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft FrontPage 2002 Standard Edition
  • Microsoft FrontPage 2000 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Outlook 2000 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
키워드:?
kbhowto kbautomation KB238228

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com