home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / bp_1_94 / vbwin / visio / visreg.bas < prev    next >
BASIC Source File  |  1993-09-14  |  16KB  |  458 lines

  1. '------------------------------------------------------------------------------
  2. '------------------------------------------------------------------------------
  3. '--
  4. '--                   Visio Instance Registration Utilites
  5. '--                       (C)1993 Shapeware Corporation
  6. '--
  7. '--   File Name : visreg.bas
  8. '--
  9. '-- Description : Contains helper functions for working with Visio instances.
  10. '--               To use this module include it into your project and use one
  11. '--               of the three levels available.  For more information see
  12. '--               below.
  13. '--
  14. '--               The registration utility offers an easy way get and create
  15. '--               Visio instance objects.  It offers three levels of instancing
  16. '--               from simple get/create/release to registration where the
  17. '--               library maintains the "signature" of a Visio instance and
  18. '--               warns you when the active instance changes.
  19. '--
  20. '--               The library maintains a static global g_appVisio which
  21. '--               is called the global instance object (GIO).  Use GIO in
  22. '--               your code when refering to the working instance of Visio.
  23. '--               Never apply the Set operator to GIO yourself (unless you
  24. '--               really know what your doing).
  25. '--
  26. '--               To use the library, include it in your project and refer the
  27. '--               visio application object through g_appVisio (GIO).
  28. '--               Read the sections below to find the level of functionality
  29. '--               you want.
  30. '--
  31. '--               Low Level Routines
  32. '--
  33. '--               The low level routines are almost identical to what you
  34. '--               would use normally with GetObject and CreateObject.
  35. '--               However they encapsulate the error handling.
  36. '--
  37. '--                   vaoGetGIO()     Retrieves active, running instances.
  38. '--                   vaoCreateGIO()  Creates a new instance.
  39. '--                   vaoReleaseGIO() Release the GIO instance if Set.
  40. '--                   vaoIsGIOValid() Verifies that GIO is Set and loaded.
  41. '--
  42. '--               Registration/Release Level
  43. '--
  44. '--                   Use this level when you need the registration functions
  45. '--                   to maintain the GIO but want control over how it is
  46. '--                   obtained.  The procedures are:
  47. '--
  48. '--                       vaoRegisterGIO()
  49. '--                       vaoUnRegistrGIO()
  50. '--                       vaoReSetGIO()
  51. '--                       (vaoReleaseGIO()    [From low level])
  52. '--
  53. '--                   To begin you register your instance and choose how to
  54. '--                   retrieve the GIO (Get/Create/Both) with
  55. '--                   vaoRegisterGIO() and use vaoUnRegisterGIO to release
  56. '--                   it.  This gives a good amount of flexibility but leaves
  57. '--                   it up to you to handle the conditions where Visio is shut
  58. '--                   down or a new instance is loaded.  At this level you keep
  59. '--                   the instance registered but release the GIO using
  60. '--                   vaoReleaseGIO.  To get back GIO use vaoReSetGIO.
  61. '--
  62. '--               Most Common Level
  63. '--
  64. '--                   This is highest, most abstract level.  It's called Most
  65. '--                   Common level because most scripts will probably use it
  66. '--                   to get instance objects.  There is one function:
  67. '--
  68. '--                       vaoGetObject()
  69. '--
  70. '--                   When called it will check to see if the GIO is already
  71. '--                   registered.  If not it will first attempt a GetObject
  72. '--                   and, if that fails, will use CreateObject.  Unless Visio
  73. '--                   is not installed, you will get visOK back.  On subsequent
  74. '--                   calls it checks that it is still valid (not UnSet and
  75. '--                   still running).  If so it returns visOK, otherwise it
  76. '--                   tries to register the GIO again.  If that fails you
  77. '--                   receive visError.  The nice thing about this is that one
  78. '--                   call maintains the GIO for you.
  79. '--
  80. '-- Audit Trail:
  81. '--
  82. '--    When  |  Ver  | Who | Description
  83. '-- ---------------------------------------------------------------------------
  84. '--  9/14/93 | 1.004 | TDS | Added abstract descriptions of each level.
  85. '--                        | Added vaoGetVisio().
  86. '--  8/30/93 | 1.003 | TDS | Updated all debug messages to show file and
  87. '--                        | procedure name.
  88. '--  8/12/93 | 1.002 | TDS | Update vaoGetObject to always return visOK unless
  89. '--                        | an error occurred.  Always retrieves an object
  90. '--                        | regardless of manner.
  91. '--   8/9/93 | 1.001 | TDS | Fixed SetHWND bug, was using REG_GET.  Also
  92. '--                        | removed ByVal from VisWindowHandle iArg.  Found
  93. '--                        | way to verify instance is loaded vaoIsGIOValid.
  94. '--                        | Updated vaoGetObject to use it.
  95. '--   8/4/93 | 1.000 | TDS | Created
  96. '--
  97. '------------------------------------------------------------------------------
  98. '------------------------------------------------------------------------------
  99.  
  100. Option Explicit                                 '-- All Variable Explicit!
  101.  
  102. Global g_appVisio As object
  103.  
  104. Const REG_GET_HWND = 1
  105. Const REG_SET_HWND = 2
  106.  
  107. Global Const visDiffInst = 1
  108. Global Const visGet = 2
  109. Global Const visCreate = 3
  110. Global Const visVisioQuit = 4
  111. Global Const visError = 5
  112. Global Const visRegistered = 6
  113. Global Const visOK = 7
  114.  
  115. Private Function GetHWND ()
  116. '-------------------------------
  117. '--- GetHWND -------------------
  118. '--
  119. '--   Returns the registered Visio Window Handle.
  120. '--
  121.  
  122.     Dim iTemp As Integer
  123.  
  124.     VisWindowHandle REG_GET_HWND, iTemp
  125.  
  126.     GetHWND = iTemp
  127. End Function
  128.  
  129. Private Function Registered () As Integer
  130. '-------------------------------
  131. '--- RegisterVisio -------------
  132. '--
  133. '--   Returns boolean integer indicating if we are registered or not.
  134. '--
  135.  
  136.     Registered = (GetHWND() <> 0)
  137. End Function
  138.  
  139. Private Sub SetHWND (ByVal iNewHWND As Integer)
  140. '-------------------------------
  141. '--- SetHWND -------------------
  142. '--
  143. '--   Sets the registered Visio Window Handle.
  144. '--
  145.  
  146.     VisWindowHandle REG_SET_HWND, iNewHWND
  147. End Sub
  148.  
  149. Function vaoCreateGIO () As Integer
  150. '-------------------------------
  151. '--- vaoCreateGIO --------------
  152. '--
  153. '--   Uses CreateObject to create a new instance of Visio.  If it fails
  154. '-- False is returned, otherwise the GIO is set to the instance created
  155. '-- and True is returned.
  156. '--
  157.  
  158.     On Error GoTo vaoCreateGIOErrorHandler
  159.  
  160.     Debug.Print "VISREG.BAS vaoCreateGIO() - Creating new Visio instance."
  161.  
  162.     Set g_appVisio = CreateObject("visio.application")
  163.  
  164.     If Not (g_appVisio Is Nothing) Then
  165.     vaoCreateGIO = True
  166.     End If
  167.  
  168.     Exit Function
  169.  
  170. vaoCreateGIOErrorHandler:
  171.     Debug.Print "VISREG.BAS vaoCreateGIO() - Failed."
  172.     Exit Function
  173.     Resume Next
  174. End Function
  175.  
  176. Function vaoGetGIO () As Integer
  177. '-------------------------------
  178. '--- vaoGetGIO -----------------
  179. '--
  180. '--   Uses GetObject to get the active instance of Visio.  If GetObject fails
  181. '-- False is returned, otherwise the GIO is set and True is returned.
  182. '--
  183.  
  184.     On Error GoTo vaoGetErrorHandler
  185.  
  186.     Debug.Print "VISREG.BAS vaoGetGIO() - Retrieving active Visio instance."
  187.  
  188.     Set g_appVisio = GetObject(, "visio.application")
  189.  
  190.     If Not (g_appVisio Is Nothing) Then
  191.     vaoGetGIO = True
  192.     End If
  193.     
  194.     Exit Function
  195.  
  196. vaoGetErrorHandler:
  197.     Debug.Print "VISREG.BAS vaoGetGIO() - Failed."
  198.     Exit Function
  199.     Resume Next
  200. End Function
  201.  
  202. Function vaoGetObject () As Integer
  203. '-------------------------------
  204. '--- vaoGetObject --------------
  205. '--
  206. '--   Uses registration procedures to maintain the GIO.  This funciton makes
  207. '-- up the Common Use Layer (most commonly used procedure) for using the GIO.
  208. '-- Just call it every time you need to work with Visio and it will make sure
  209. '-- you have a valid working copy.
  210. '--
  211. '-- Return Values:
  212. '--  visOK        - The GIO is set to a valid working instance of Visio.
  213. '--  visError     - Visio 2.0 or OLE not installed or some other serious
  214. '--                 error occurred.
  215. '--
  216.  
  217.     Dim iRetVal As Integer, iTemp As Integer, l_appVisio As object
  218.     
  219.     iRetVal = visOK                             '-- Default To OK
  220.  
  221.     If Registered() Then                        '-- When Registerd...
  222.     If Not vaoIsGIOValid() Then             '--   If GIO Is Valid...
  223.         Debug.Print "VISREG.BAS vaoGetObject() - Re-registering instance."
  224.  
  225.         '-- Somehow the GIO is no longer valid, either because it was
  226.         '-- vaoReleaseGIO'd or is no longer running.  Therefore we just
  227.         '-- try to re-register and if the same instance is active, we
  228.         '-- get that one again.  Otherwise we end up with the active
  229.         '-- instance of Visio or a newly created one.
  230.         '--
  231.         '-- In future versions of Visio we will iterate through the
  232.         '-- instance collection and retrieve the instance we originally
  233.         '-- registered to if it still exists.
  234.  
  235.         vaoUnRegisterGIO                    '--   Oops, Its Bad Now...
  236.  
  237.         If vaoRegisterGIO(True, True) = visError Then
  238.         iRetVal = visError
  239.         End If
  240.     End If
  241.     Else
  242.     If vaoRegisterGIO(True, True) = visError Then iRetVal = visError
  243.     End If
  244.  
  245.     vaoGetObject = iRetVal
  246. End Function
  247.  
  248. Function vaoGetVisio (bGet As Integer, bCreate As Integer) As Integer
  249. '-------------------------------
  250. '--- vaoGetVisio ---------------
  251. '--
  252. '--   Identical to vaoRegisterGIO except doesn't use registration functions.
  253. '--
  254. '-- Parameters : bUseExisting - Boolean - Use vaoGetGIO() first.
  255. '--              bCreate      - Boolean - Use vaoCreateGIO().
  256. '--
  257. '--    Returns : visError     - If an error occurred and the GIO could not be
  258. '--                             set.  Either the flags were invalid or
  259. '--                             Get & Create failed.
  260. '--              visGet       - When a vaoGetGIO() retrieved the GIO.
  261. '--              visCreate    - When a vaoCreateGIO() retrieved the GIO.
  262. '--              visRegisterd - Failed - GIO is registered.  Use
  263. '--                             vaoUnRegisterGIO().
  264. '--
  265.  
  266.     Dim iRetVal As Integer
  267.  
  268.     ' If registered we fail.
  269.     '
  270.     If Registered() Then
  271.     iRetVal = visRegistered
  272.     GoTo lblGetVisioCleanUp
  273.     End If
  274.  
  275.     iRetVal = visError
  276.     
  277.     ' If the Get flag was set we first try vaoGetGIO()
  278.     '
  279.     If bGet Then
  280.     If vaoGetGIO() Then iRetVal = visGet
  281.     End If
  282.  
  283.     ' If the Create flag is on and the return value doesn't indicate that
  284.     ' a get worked then we use create.
  285.     '
  286.     If bCreate And (iRetVal <> visGet) Then
  287.     If vaoCreateGIO() Then iRetVal = visCreate
  288.     End If
  289.  
  290.     ' If the GIO isn't set at this point we output an error message.
  291.     '
  292.     If g_appVisio Is Nothing Then
  293.     Debug.Print "VISREG.BAS vaoRegisterGIO() - Error registering GIO."
  294.     End If
  295.         
  296. lblGetVisioCleanUp:
  297.     vaoGetVisio = iRetVal
  298. End Function
  299.  
  300. Function vaoIsGIOValid () As Integer
  301. '-------------------------------
  302. '--- vaoIsGIOValid -------------
  303. '--
  304. '--   Our validity test simply checks to see if the GIO is set and, if so,
  305. '-- checks if it is loaded.
  306. '--
  307. '-- Returns : True if GIO is set and loaded, False otherwise.
  308. '--
  309.     On Error GoTo lblvaoGIOValidErr
  310.  
  311.     Dim iTemp As Integer
  312.  
  313.     vaoIsGIOValid = False                           '-- Default To False
  314.  
  315.     If (g_appVisio Is Nothing) Then Exit Function   '-- Not Set
  316.  
  317.     iTemp = g_appVisio.Documents.Count              '-- Try A Property
  318.  
  319.     vaoIsGIOValid = True                            '-- No Error - Valid!
  320.     Exit Function
  321.  
  322. lblvaoGIOValidErr:
  323.     Exit Function                                   '-- Error - Invalid
  324.     Resume Next
  325. End Function
  326.  
  327. Function vaoRegisterGIO (bUseExisting As Integer, bCreate As Integer) As Integer
  328. '-------------------------------
  329. '--- vaoRegisterGIO ------------
  330. '--
  331. '--   Registers the GIO using two parameters to decide how the Visio instance
  332. '-- should be created.  Use vaoUnRegisterGIO to reverse the registration.
  333. '--
  334. '-- Parameters : bUseExisting - If True then GetObject will tried first.
  335. '--              bCreate      - If True CreateObject will be called after
  336. '--                             any GetObject calls.
  337. '--
  338. '--    Returns : visError     - If an error occurred and the GIO could not be
  339. '--                             registered because either the flags passed
  340. '--                             were invalid or Get & Create failed.
  341. '--              visGet       - When a GetObject retrieved the GIO.
  342. '--              visCreate    - When a CreateObject retrieved the GIO.
  343. '--              visRegisterd - When already registered.
  344. '--
  345.  
  346.     Dim iRetVal As Integer
  347.  
  348.     If Registered() Then
  349.     iRetVal = visRegistered
  350.     GoTo lblRegisterCleanUp
  351.     End If
  352.  
  353.     iRetVal = visError
  354.  
  355.     If bUseExisting Then
  356.     If vaoGetGIO() Then iRetVal = visGet
  357.     End If
  358.  
  359.     If bCreate And (iRetVal <> visGet) Then
  360.     If vaoCreateGIO() Then iRetVal = visCreate
  361.     End If
  362.  
  363.     If g_appVisio Is Nothing Then
  364.     Debug.Print "VISREG.BAS vaoRegisterGIO() - Error registering GIO."
  365.     Else
  366.     SetHWND g_appVisio.WindowHandle
  367.     End If
  368.  
  369. lblRegisterCleanUp:
  370.     vaoRegisterGIO = iRetVal
  371. End Function
  372.  
  373. Sub vaoReleaseGIO ()
  374. '-------------------------------
  375. '--- vaoReleaseGIO -------------
  376. '--
  377. '--   Handles releasing the GIO.  Does not unregister the window handle.
  378. '-- If using the registration interfaces use vaoReSetGIO to retrieve the
  379. '-- GIO, otherwise you may use vaoGetGIO or vaoCreateGIO.  This does not
  380. '-- take affect until all other references go out of scope.
  381. '--
  382.  
  383.     Set g_appVisio = Nothing                '-- Release Resources
  384.  
  385.     Debug.Print "VISREG.BAS vaoReleaseGIO() - Complete."
  386. End Sub
  387.  
  388. Function vaoReSetGIO () As Integer
  389. '-------------------------------
  390. '--- vaoReSetGIO ---------------
  391. '--
  392. '--   Tries to re-Set the GIO only if we are registered and the GIO is not
  393. '-- already set.
  394. '--
  395. '-- Return Values :
  396. '--   visError     - If not registered or GIO is already set.
  397. '--   visOK        - If able to reSet the GIO to the registered instance.
  398. '--   visVisioQuit - If Visio is no longer running.  If so then the GIO is
  399. '--                  unregistered because the HWND is no longer valid.
  400. '--   visDiffInst  - If the registered instance is no longer running.  The
  401. '--                  GIO is not set.
  402. '--
  403.  
  404.     vaoReSetGIO = visError
  405.     
  406.     If Not Registered() Or Not (g_appVisio Is Nothing) Then Exit Function
  407.  
  408.     If vaoGetGIO() Then
  409.     If g_appVisio.WindowHandle = GetHWND() Then
  410.         vaoReSetGIO = visOK
  411.     Else
  412.         vaoReleaseGIO
  413.         vaoReSetGIO = visDiffInst       '-- Release GIO
  414.     End If
  415.     Else
  416.     vaoReSetGIO = visVisioQuit
  417.     vaoUnRegisterGIO                    '-- UnRegister
  418.     End If
  419. End Function
  420.  
  421. Sub vaoUnRegisterGIO ()
  422. '-------------------------------
  423. '--- vaoUnRegisterGIO ----------
  424. '--
  425. '--   Unregisters a visio instance by clearing the window handle and releasing
  426. '-- the global instance object.
  427. '--
  428.     
  429.     SetHWND 0                           '-- Resets HWND
  430.     vaoReleaseGIO                       '-- Releases GIO
  431.     
  432.     Debug.Print "VISREG.BAS vaoUnRegisterGIO() - Completed."
  433. End Sub
  434.  
  435. Private Sub VisWindowHandle (ByVal iAction As Integer, iArg As Integer)
  436. '-------------------------------
  437. '--- VisWindowHandle -----------
  438. '--
  439. '--   Maintains the registered window handle in a static variable.
  440. '--
  441. '-- Parameters : iAction - Specifies the action to perform.  REG_GET_HWND
  442. '--                        sets iArg to the handle.  REG_SET_HWND sets the
  443. '--                        handle to iArg.
  444. '--
  445. '--              iArg    - Used in gets/sets.
  446. '--
  447.  
  448.     Static iHWND As Integer
  449.  
  450.     Select Case iAction
  451.     Case REG_GET_HWND: iArg = iHWND
  452.     Case REG_SET_HWND: iHWND = iArg
  453.     Case Else:
  454.         Debug.Print "VISREG.BAS VisWindowHandle() - Invalid Action Passed"
  455.     End Select
  456. End Sub
  457.  
  458.