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

이 문서는 이전에 다음 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 웹 사이트를 참조하십시오.참고 이 문서에 설명된 단계나 유사한 방법을 사용하여 Visual Basic COM 추가 기능에서 Office Word에 메뉴 항목을 추가하면 메뉴 항목이 제대로 작동하지 않습니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
313948 WD2002: Word에서 COM 개체 메뉴 항목(CommandBarControl)에 대한 참조가 손실된다




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

문서 ID: 238228 - 마지막 검토: 12/05/2015 15:21:14 - 수정: 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

  • kbnosurvey kbarchive kbhowto kbautomation KB238228
피드백