[AccessD] Office API's

Stuart McLachlan stuart at lexacorp.com.pg
Thu Dec 9 20:27:58 CST 2010


On 9 Dec 2010 at 20:10, Susan Harkins wrote:

> Windows API functions. 
> Susan H. 
> 
> > Susan - did you mean to say "add-ins" ?
> > I'm not sure what you are referring to....
> >>
> >> I'm writing about Office APIs -- if you have a favorite one
> >> you'd like to see showcased, let me know.
> 


Ah Windows APIs.   I use quite a few of them.    Here's a few API calls and functions that I 
use in most systems that I build (I keep them along with a number of other functions in a 
module of general functions that I just plug in to new apps by default,  Listing from the 
simplest to the most complex:

1  Sleep (suspend execute for a while a.k.a  Wait()

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


2.  Get User - Get the name of the current user for logging purposes/access control

    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
                 "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function GetUser()
    Dim Response As Long
    Dim uname As String * 32
    Response = GetUserName(uname, 32)
    GetUser = Left(uname, InStr(uname, Chr$(0)) - 1)
End Function


3.  Temp Directory  (If you need to build and run a batch file or a set of FTP commands etc)

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
                        (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Function TempDir() As String
    Dim strPath As String
    strPath = Space(MAX_PATH)
    GetTempPath Len(strPath), strPath
    TempDir = Left(strPath, InStr(1, strPath, vbNullChar) - 1)
End Function


4.   Desktop Directory ( so that I can drop files onto it or look for files on it)

Private Declare Function SHGetSpecialFolderLocation _
                          Lib "shell32" (ByVal hwnd As Long, _
                                         ByVal nFolder As Long, ppidl As Long) As Long
Private Declare Function SHGetPathFromIDList _
                          Lib "shell32" Alias "SHGetPathFromIDListA" _
                              (ByVal Pidl As Long, ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pvoid As Long)
Public Function Desktop() As String
    Dim lngPidlFound As Long
    Dim lngFolderFound As Long
    Dim lngPidl As Long
    Dim strPath As String
    Const CSIDL_DESKTOPDIRECTORY = &H10
    Const MAX_PATH = 260
    Const NOERROR = 0

    strPath = Space(MAX_PATH)
    lngPidlFound = SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, lngPidl)
    If lngPidlFound = NOERROR Then
        lngFolderFound = SHGetPathFromIDList(lngPidl, strPath)
        If lngFolderFound Then
            Desktop = Left$(strPath, _
                            InStr(1, strPath, vbNullChar) - 1) & "\"
        End If
    End If
    CoTaskMemFree lngPidl
End Function


5.  GetOpenFileName - no need to embed a control on a form to get an openfile dialog.

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
         "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Function GetFileName(Directory As String) As String
    Dim OpenFile As OPENFILENAME
    Dim lReturn As Long
    Dim sFilter As String
    OpenFile.lStructSize = Len(OpenFile)
    OpenFile.hwndOwner = 0
    OpenFile.hInstance = 0
    sFilter = "" & Chr(0)
    OpenFile.lpstrFilter = sFilter
    OpenFile.nFilterIndex = 0
    OpenFile.lpstrFile = String(257, 0)
    OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
    OpenFile.lpstrFileTitle = OpenFile.lpstrFile
    OpenFile.nMaxFileTitle = OpenFile.nMaxFile
    OpenFile.lpstrInitialDir = Directory
    OpenFile.lpstrTitle = "Select File"
    OpenFile.flags = 0
    lReturn = GetOpenFileName(OpenFile)
    GetFileName = Left$(OpenFile.lpstrFile, InStr(OpenFile.lpstrFile, Chr$(0)) - 1)
End Function



6. ShellWait - Shell out to an application and wait for it to finish before continuing 
(synchronous shell)

    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
                                  ByVal dwMilliseconds As Long) As Long
    Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, _
                  ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, _
                  ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, _
                  ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _
                  ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
                  lpProcessInformation As PROCESS_INFORMATION) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const STARTF_USESHOWWINDOW& = &H1
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
End Type

Public Sub ShellWait(Pathname As String, Optional WindowStyle As Long)
    On Error GoTo Err_Handler

    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    Dim ret As Long

    ' Initialize the STARTUPINFO structure:
    With start
        .cb = Len(start)
        If Not IsMissing(WindowStyle) Then
            .dwFlags = STARTF_USESHOWWINDOW
            .wShowWindow = WindowStyle
        End If
    End With
    ' Start the shelled application:
    ret& = CreateProcessA(0&, Pathname, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, 
start, proc)
    ' Wait for the shelled application to finish:
    ret& = WaitForSingleObject(proc.hProcess, INFINITE)
    ret& = CloseHandle(proc.hProcess)

Exit_Here:
    Exit Sub
Err_Handler:
    MsgBox Err.Description, vbExclamation, "E R R O R"
    Resume Exit_Here

End Sub



-- 
Stuart





More information about the AccessD mailing list