Here's my version, most of those regsvr stuff is the same. But mine works for any acad version (i.e. 18, 17, 16, etc.):(vl-load-com)
;;; Calls REGSVR32 to Register a DLL silently
(defun DLLRegister (dll) (startapp "regsvr32.exe" (strcat "/s \"" dll "\"")))
;;; Returns the ProgID for a given ClassID if found in registry
(defun ProgID->ClassID (ProgID) (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" progid "\\CLSID")))
;;; Try to Register ObjectDBX if not done so already
;;; Returns the Class Name if already registered / sucessfully registered
;;; Else returns nil if failure
(defun DBX-Register (classname filename / server acver)
(cond
((not (and classname filename))
(DBX-Register
(strcat "ObjectDBX.AxDbDocument." (itoa (setq acver (atoi (getvar 'ACadVer)))))
(strcat "AxDb" (itoa acver) ".dll")
)
)
((ProgID->ClassID classname) classname)
((setq server (findfile filename))
(cond
((and (DLLRegister server) (ProgID->ClassID classname)) classname)
(t nil)
)
)
(t (DBX-Register "ObjectDBX.AxDbDocument" "AxDb.dll"))
)
)
;;; Try to reference ObjectDBX - returns the ActiveX object if sucessful
;;; Else returns nil if failure
(defun Get-ObjectDBX (/ classname)
(if (setq classname (DBX-Register nil nil))
(vla-getinterfaceobject (vlax-get-acad-object) classname)
)
)
;;; Try to open an ObjectDBX document. Returns ActiveX object if sucessful, else nil
(defun Open-DBXdoc (filename / dbx)
(if (and (setq dbx (findfile filename))
(setq dbx (Get-ObjectDBX))
(not
(vl-catch-all-error-p (setq dbx (vl-catch-all-apply 'vla-Open (list dbx (findfile filename)))))
)
)
dbx
)
)