Microsoft KB Archive/217176

= How To Display and Use the OLE Insert Object Dialog Box in VB =

Article ID: 217176

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Learning Edition
 * Microsoft Visual Basic 6.0 Learning 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

-



This article was previously published under Q217176



SUMMARY
The Insert Object dialog box is used widely in OLE based applications. This article shows you how to display the standard Insert Object dialog box using Visual Basic. It also demonstrates the use of the OLE APIs that need to pass LPOLESTR * from Visual Basic.



MORE INFORMATION
The following example displays an Insert Object dialog box and inserts what you select in a rich text box.

Steps to Create the Sample
 Create a Visual Basic Standard EXE project. Form1 is created by default. From the Projects menu, choose Components then select the Microsoft Rich Text Control x.x. Click OK. Add a rich text box and a command button to Form1.  Add the following code to the General Declarations section of Form1:

Option Explicit

' This is the main API used to display the Insert Obj DlgBox Private Declare Function OleUIInsertObject Lib "oledlg.dll" _ Alias "OleUIInsertObjectA" (inParam As Any) As Long

' This is used to get the ProgID from Class ID. ' Note that this API need us to pass LPOLESTR * from Visual Basic. Private Declare Function ProgIDFromCLSID Lib "ole32.dll" _ (clsid As Any, strAddess As Long) As Long

' The memory allocated OLE way need to be released OLE way ' with this API. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pvoid As Long)

' Widely used CopyMemory API. Private Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (Destination As Any, Source As Any, _  ByVal Length As Long)

' Note that you need to get the strlength of the UNICODE string. Private Declare Function lstrlenW Lib "kernel32" _ (ByVal lpString As Long) As Long

' Constants used in the dwFlags of OleUIInsertObjectType. Const IOF_SHOWHELP = &H1 Const IOF_SELECTCREATENEW = &H2 Const IOF_SELECTCREATEFROMFILE = &H4 Const IOF_CHECKLINK = &H8 Const IOF_CHECKDISPLAYASICON = &H10 Const IOF_CREATENEWOBJECT = &H20 Const IOF_CREATEFILEOBJECT = &H40 Const IOF_CREATELINKOBJECT = &H80 Const IOF_DISABLELINK = &H100 Const IOF_VERIFYSERVERSEXIST = &H200 Const IOF_DISABLEDISPLAYASICON = &H400 Const IOF_HIDECHANGEICON = &H800 Const IOF_SHOWINSERTCONTROL = &H1000 Const IOF_SELECTCREATECONTROL = &H2000

' Return codes from OleUIInsertObject Const OLEUI_FALSE = 0 Const OLEUI_SUCCESS = 1              ' No error, same as OLEUI_OK. Const OLEUI_OK = 1                   ' OK button pressed. Const OLEUI_CANCEL = 2               ' Cancel button pressed.

' GUID, IID, CLSID, etc Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type

' Main UDT used in OleUIInsertObject. Private Type OleUIInsertObjectType ' These IN fields are standard across all OLEUI dialog box functions. cbStruct As Long dwFlags As Long hWndOwner As Long lpszCaption As String    ' LPCSTR lpfnHook As Long         ' LPFNOLEUIHOOK lCustData As Long        ' LPARAM hInstance As Long lpszTemplate As String   ' LPCSTR hResource As Long        ' HRSRC clsid As GUID ' Specifics for OLEUIINSERTOBJECT. lpszFile As String       ' LPTSTR cchFile As Long cClsidExclude As Long lpClsidExclude As Long   ' LPCLSID IID As GUID ' Specifics to create objects if flags say so. oleRender As Long lpFormatEtc As Long      ' LPFORMATETC lpIOleClientSite As Long ' LPOLECLIENTSITE lpIStorage As Long       ' LPSTORAGE ppvObj As Long           ' LPVOID FAR * sc As Long               ' SCODE hMetaPict As Long        ' HGLOBAL End Type

Private Sub Command1_Click Dim UIInsertObj As OleUIInsertObjectType Dim retValue As Long Dim lpolestr As Long Dim strsize As Long Dim ProgId As String

On Error GoTo err

' Prepare the OleUIInsertObjectType. UIInsertObj.cbStruct = LenB(UIInsertObj) UIInsertObj.dwFlags = IOF_SELECTCREATENEW UIInsertObj.hWndOwner = Me.hWnd UIInsertObj.lpszFile = String(256, " ") UIInsertObj.cchFile = Len(UIInsertObj.lpszFile)

' Call the API to display the dialog box. retValue = OleUIInsertObject(UIInsertObj)

If (retValue = OLEUI_OK) Then ' If we select to insert from a new object If ((UIInsertObj.dwFlags And IOF_SELECTCREATENEW) = _                IOF_SELECTCREATENEW) Then

' You need to get the ProgID. ' Note that we pass in a long byref. retValue = ProgIDFromCLSID(UIInsertObj.clsid, lpolestr)

' The size you need to initialize is the strlen + 1. strsize = lstrlenW(lpolestr) + 1 ProgId = String(strsize, 0)

' Copy the string to BSTR. Notice the StrPtr function. ' Also notice that every UNICODE char is 2 bytes. CopyMemory ByVal StrPtr(ProgId), ByVal lpolestr, strsize * 2

' We need to free the memory allocated by ProgIDFromCLSID API. CoTaskMemFree lpolestr RichTextBox1.OLEObjects.add, , "", ProgId

Else ' If we select to insert from file RichTextBox1.OLEObjects.add, , UIInsertObj.lpszFile End If     End If

Exit Sub

err: MsgBox err.Description End Sub  Press F5 to run the project. Click the command button and a dialog box displays. Select an insertable object from the list and click OK. The object is inserted into your rich text box.

