Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Question for MCRIDER (or anyone else) reading all of the information about a lnk file

Posted on 2005-04-27
6
Medium Priority
?
211 Views
Last Modified: 2011-09-20
Hello MC,

In article Q_10205631 you wrote:

In case any of you are interrested, this will return all of the information about a link.

Add the following to a MODULE:

'-------------------------------------------------------------------------------
    Type LnkHeader
        SOH As Long
        GUID As String * 16
        Flags As Long
        Attributes As Long
        CreatedTime As Double
        ModifiedTime As Double
        LastAccessed As Double
        Length As Long
        Icon As Long
        ShowWindow As Long
        HotKey As Long
        Resvd1 As Long
        Resvd2 As Long
        ShellIDLen As Integer
    End Type
     
    Type LnkFLocInfo
        Length As Long
        Offset As Long
        Flags As Long
        LocVolInfoOffset As Long
        BasePathOffset As Long
        NetVolInfoOffset As Long
        NetRemainingPathOffset As Long
    End Type
     
    Type LnkLocVolTable
        Length As Long
        VolType As Long
        SerialNumber As Long
        VolNameOffset As Long
    End Type
     
    Type LnkNetVolTable
        Length As Long
        Resvd1 As Long
        ShareNameOffset As Long
        Resvd2 As Long
        Resvd3 As Long
    End Type
     
    Type LnkFileEntry
        Size As Integer
        Path As String * 256
    End Type
     
    Type LinkInfo
        VolumeLabel As String
        NetShareName As String
        BasePath As String
        RemainingPath As String
        LastModified As String
        Description As String
        RelativePath As String
        WorkingDirectory As String
        CommandLine As String
        IconFile As String
    End Type
     
    Function BitValue(BitNumber As Integer, Value As Variant) As Boolean
        Dim lBits As String
        If UCase$(Left$(CStr(Value), 2)) = "&B" Then
            lBits = Right$(String(128, "0") + Mid$(Value, 3), 128)
        Else
            lBits = cvtBin(Value, 128)
        End If
        If Left$(Right$(lBits, BitNumber + 1), 1) = "1" Then BitValue = True
    End Function
     
    Function cvtBin(Value As Variant, Length As Integer) As String
        Dim BinString As String
        Dim lHex As String
        Dim iVal As Integer
        lHex = UCase$(Hex$(Val(Value)))
        BinString = String(Length, "0")
        For iVal = 1 To Len(lHex)
            Select Case Mid$(lHex, iVal, 1)
                Case "0": BinString = BinString + "0000"
                Case "1": BinString = BinString + "0001"
                Case "2": BinString = BinString + "0010"
                Case "3": BinString = BinString + "0011"
                Case "4": BinString = BinString + "0100"
                Case "5": BinString = BinString + "0101"
                Case "6": BinString = BinString + "0110"
                Case "7": BinString = BinString + "0111"
                Case "8": BinString = BinString + "1000"
                Case "9": BinString = BinString + "1001"
                Case "A": BinString = BinString + "1010"
                Case "B": BinString = BinString + "1011"
                Case "C": BinString = BinString + "1100"
                Case "D": BinString = BinString + "1101"
                Case "E": BinString = BinString + "1110"
                Case "F": BinString = BinString + "1111"
            End Select
        Next iVal
        cvtBin = Right$(BinString, Length)
    End Function
     
    Function GetLinkInfo(LinkPath As String) As LinkInfo
        Dim LinkHeader As LnkHeader
        Dim FileLocBlock As LnkFLocInfo
        Dim LocVolTable As LnkLocVolTable
        Dim NetVolTable As LnkNetVolTable
        Dim LinkInfo As LinkInfo
        Dim fInfo As LnkFileEntry
        Dim lIndex As Long
        Dim fNum As Long
        Dim fLen As Long
        Dim iVal As Long
        Dim lBuf As String
        Dim lPath As String * 256
         
        On Error Resume Next
        fNum = FreeFile
        Err = 0
        Open LinkPath For Binary Access Read As fNum
        If Not Err = 0 Then Exit Function
        LinkInfo.LastModified = FileDateTime(LinkPath)
        fLen = LOF(fNum)
        Get #fNum, 1, LinkHeader
        Get #fNum, LinkHeader.ShellIDLen + 79, FileLocBlock
        Get #fNum, FileLocBlock.LocVolInfoOffset + LinkHeader.ShellIDLen + 79, LocVolTable
        Get #fNum, LocVolTable.VolNameOffset + FileLocBlock.LocVolInfoOffset _
            + LinkHeader.ShellIDLen + 80, lPath
        LinkInfo.VolumeLabel = Left$(lPath, InStr(1, lPath, Chr$(0)) - 1)
        Get #fNum, FileLocBlock.NetVolInfoOffset + LinkHeader.ShellIDLen + 79, NetVolTable
        Get #fNum, NetVolTable.ShareNameOffset + FileLocBlock.NetVolInfoOffset _
            + LinkHeader.ShellIDLen + 79, lPath
        LinkInfo.NetShareName = Left$(lPath, InStr(1, lPath, Chr$(0)) - 1)
        Get #fNum, FileLocBlock.BasePathOffset + LinkHeader.ShellIDLen + 79, lPath
        LinkInfo.BasePath = Left$(lPath, InStr(1, lPath, Chr$(0)) - 1)
        Get #fNum, FileLocBlock.NetRemainingPathOffset + LinkHeader.ShellIDLen + 79, lPath
        LinkInfo.RemainingPath = Left$(lPath, InStr(1, lPath, Chr$(0)) - 1)
        lIndex = Len(LinkInfo.RemainingPath) + NetVolTable.Length _
            + FileLocBlock.NetVolInfoOffset + LinkHeader.ShellIDLen + 80
        If BitValue(2, LinkHeader.Flags) = True Then
            Get #fNum, lIndex, fInfo
            LinkInfo.Description = Left$(fInfo.Path, fInfo.Size)
            lIndex = lIndex + fInfo.Size + 2
        End If
        If BitValue(3, LinkHeader.Flags) = True Then
            Get #fNum, lIndex, fInfo
            LinkInfo.RelativePath = Left$(fInfo.Path, fInfo.Size)
            lIndex = lIndex + fInfo.Size + 2
        End If
        If BitValue(4, LinkHeader.Flags) = True Then
            Get #fNum, lIndex, fInfo
            LinkInfo.WorkingDirectory = Left$(fInfo.Path, fInfo.Size)
            lIndex = lIndex + fInfo.Size + 2
        End If
        If BitValue(5, LinkHeader.Flags) = True Then
            Get #fNum, lIndex, fInfo
            LinkInfo.CommandLine = Left$(fInfo.Path, fInfo.Size)
            lIndex = lIndex + fInfo.Size + 2
        End If
        If BitValue(6, LinkHeader.Flags) = True Then
            Get #fNum, lIndex, fInfo
            LinkInfo.IconFile = Left$(fInfo.Path, fInfo.Size)
            lIndex = lIndex + fInfo.Size + 2
        End If
        Close #fNum
        GetLinkInfo = LinkInfo
    End Function
'-------------------------------------------------------------------------------

I tested it but i can't get the WorkingDirectory, CommandLine and IconFile information.

For some reason The info get's cloaked up after the Description info.

This is the testcode (Your code is stored in a module):

Option Explicit
 
Private Sub Form_Load()
    Me.OLEDropMode = 1 ' manual
End Sub

Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
   
    OLEDD Data
End Sub

Public Sub OLEDD(Data As DataObject)
    Dim i As Integer, Filename As String
    Dim sResult As String
    sResult = vbCrLf & "Information found in the shortcut : " & vbCrLf & vbCrLf
   
    If Data.GetFormat(vbCFFiles) Then
        For i = 1 To Data.Files.Count
            Filename = Data.Files.Item(i)
           
            ' do something with file
            With GetLinkInfo(Filename)
                sResult = sResult & "VolumeLabel      = " & .VolumeLabel & vbCrLf
                sResult = sResult & "NetShareName     = " & .NetShareName & vbCrLf
                sResult = sResult & "BasePath         = " & .BasePath & vbCrLf
                sResult = sResult & "RemainingPath    = " & .RemainingPath & vbCrLf
                sResult = sResult & "LastModified     = " & .LastModified & vbCrLf
                sResult = sResult & "Description      = " & .Description & vbCrLf
                sResult = sResult & "RelativePath     = " & .RelativePath & vbCrLf
                sResult = sResult & "WorkingDirectory = " & .WorkingDirectory & vbCrLf
                sResult = sResult & "CommandLine      = " & .CommandLine & vbCrLf
                sResult = sResult & "IconFile         = " & .IconFile
            End With
            MsgBox sResult
        Next
    End If
End Sub

Do you know why it stops after the description info?

Regards,

Paul

0
Comment
Question by:Sector10
  • 3
  • 3
6 Comments
 
LVL 28

Expert Comment

by:Ark
ID: 13882707

Private Function TrimNull(startstr As String) As String
   Dim pos As Integer
   pos = InStr(startstr, Chr$(0))
   If pos Then
      TrimNull = Left$(startstr, pos - 1)
      Exit Function
   End If
   TrimNull = startstr
End Function

'....
sResult = sResult & "VolumeLabel      = " & TrimNull(.VolumeLabel) & vbCrLf
'....
sResult = sResult & "Description      = " & TrimNull(.Description) & vbCrLf
'....
0
 
LVL 1

Author Comment

by:Sector10
ID: 13883951
Hi Ark,

I've added your function and tp test it i created a shortcut on my desktop.

General   :  Notepad
Target    :  %SystemRoot%\system32\notepad.exe
Start in   :  %HOMEDRIVE%%HOMEPATH%

Drag and dropped the shortcut to read its info and this was the result:

VolumeLabel        = C:\WINDOWS\system32\notepad.exe
NetShareName     =
BasePath              = C:\WINDOWS\system32\notepad.exe
RemainingPath     =
LastModified        = 27-04-2005 14:43:35
Description          =
RelativePath        =
WorkingDirectory  =
CommandLine      =
IconFile               =

I still can't retrieve the WorkingDirectory, CommandLine and or IconFile information...
I know that some programmers use Windows Scripting Host to retrieve the information, but i don't want to use it because of the possibility of a potential security risk.

So i hope that someone has the answer for me and can help me with this.

Regards,

Paul

 
0
 
LVL 1

Author Comment

by:Sector10
ID: 13883956
This is the testcode with your function in it:

            With GetLinkInfo(Filename)
                Debug.Print "VolumeLabel      = "; TrimNull(.VolumeLabel)
                Debug.Print "NetShareName     = "; .NetShareName
                Debug.Print "BasePath         = "; .BasePath
                Debug.Print "RemainingPath    = "; .RemainingPath
                Debug.Print "LastModified     = "; .LastModified
                Debug.Print "Description      = "; TrimNull(.Description)
                Debug.Print "RelativePath     = "; .RelativePath
                Debug.Print "WorkingDirectory = "; .WorkingDirectory
                Debug.Print "CommandLine      = "; .CommandLine
                Debug.Print "IconFile         = " & .IconFile
            End With

Hope it helps

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 28

Accepted Solution

by:
Ark earned 2000 total points
ID: 13891791
'====bas module code=====
Option Explicit

Private Type Guid
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type SYSTEMTIME
   wYear As Integer
   wMonth As Integer
   wDayOfWeek As Integer
   wDay As Integer
   wHour As Integer
   wMinute As Integer
   wSecond As Integer
   wMilliseconds As Integer
End Type

Private Enum lfhFlags 'LnkFileHeader flags
    hasPIDL = &H1         'The shell item id list is present.
    isFile = &H2          'Points to a file or directory.
    hasDescription = &H4
    hasRelPath = &H8
    hasWorkingDir = &H10
    hasCommandLine = &H20
    hasIcon = &H40
End Enum

Private Type LnkFileHeader
    SOH          As Long     'Signature (always 0x0000004C 'L')
    tGuid        As Guid     'GUID of shortcut files
    Flags        As Long
    Attributes   As Long
    CreatedTime  As FILETIME
    ModifiedTime As FILETIME
    LastAccessed As FILETIME
    FileLength   As Long
    iIcon        As Long
    ShowWindow   As Long     'ShowWnd value (SW_XXX constants)
    HotKey       As Long
    Resvd1       As Long
    Resvd2       As Long
End Type
     
     
Private Type LnkFileLocationInfo
    cbSize              As Long
    FirstOffset         As Long '0x1C
    Flags               As Long
    LocalVolInfoOffset  As Long
    BasePathOffset      As Long
    NetVolInfoOffset    As Long
    RemainingPathOffset As Long
End Type
     
Private Type LnkLocalVolTable
    cbSize        As Long
    volType       As Long
    SerialNumber  As Long
    VolNameOffset As Long   'Always 0x10 under normal conditions
End Type
     
Private Type LnkNetVolTable
    cbSize          As Long
    Resvd1          As Long
    ShareNameOffset As Long 'Always 0x14 under normal conditions
    Resvd2          As Long
    Resvd3          As Long
End Type
     
Private Type LnkFileEntry
    Size As Integer
    Path As String * 256
End Type
     
Public Type LinkInfo
    BasePath         As String
    RemainPath       As String
    FileLength       As Long
    Attributes       As Long
    IconNum          As Long
    ShowWndConst     As Long
    HotKey           As Long
    DateCreated      As Date
    DateModified     As Date
    DateLastAccess   As Date
    VolumeLabel      As String
    VolumeSerial     As String
    VolumeType       As String
    NetShareName     As String
    Description      As String
    RelativePath     As String
    WorkingDirectory As String
    CommandLine      As String
    IconFile         As String
End Type

Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
   
Public Function GetLinkInfo(LinkPath As String) As LinkInfo
    Dim hdr As LnkFileHeader
    Dim flb As LnkFileLocationInfo
    Dim lvt As LnkLocalVolTable
    Dim nvt As LnkNetVolTable
    Dim LinkInfo As LinkInfo
    Dim fInfo As LnkFileEntry
    Dim fNum As Long, lOffset As Long
    Dim sBuf As String
    Dim pidlSize As Integer, stringSize As Integer
    Dim abDummy() As Byte
    Dim volTypes As Variant
    Dim isNT As Boolean
   
    isNT = IsWindowsNT
    volTypes = Array("Unknown", "No_Root", "Removable", "Fixed", "Remote", "CD-ROM", "Ram Drive")
    fNum = FreeFile
    Open LinkPath For Binary Access Read As fNum
        Get #fNum, , hdr 'get LnkFileHeader
'==============================Get base info========================
        LinkInfo.FileLength = hdr.FileLength
        LinkInfo.Attributes = hdr.Attributes
        LinkInfo.IconNum = hdr.iIcon
        LinkInfo.ShowWndConst = hdr.ShowWindow
        LinkInfo.HotKey = hdr.HotKey
        LinkInfo.DateCreated = FileTimeToVBDate(hdr.CreatedTime)
        LinkInfo.DateModified = FileTimeToVBDate(hdr.ModifiedTime)
        LinkInfo.DateLastAccess = FileTimeToVBDate(hdr.LastAccessed)
'====================================================================
        lOffset = Len(hdr) + 1
        If hdr.Flags And hasPIDL Then 'skip PIDL list
           Get #fNum, , pidlSize
           ReDim abDummy(pidlSize - 1)
           Get #fNum, , abDummy
           lOffset = lOffset + pidlSize + 2
        End If
        Get #fNum, , flb 'get LnkFileLocationInfo
        If flb.Flags And 1 Then 'Get Volume Info
           If flb.LocalVolInfoOffset Then
              Get #fNum, lOffset + flb.LocalVolInfoOffset, lvt
              sBuf = Right("00000000" & Hex(lvt.SerialNumber), 8)
              LinkInfo.VolumeSerial = Left(sBuf, 4) & "-" & Right(sBuf, 4)
              LinkInfo.VolumeType = volTypes(lvt.volType)
              stringSize = lvt.cbSize - lvt.VolNameOffset
           End If
           If stringSize > 0 Then
              sBuf = Space(stringSize)
              Get #fNum, , sBuf
              LinkInfo.VolumeLabel = TrimNull(sBuf)
           End If
           If flb.BasePathOffset Then
              sBuf = Space(256)
              Get #fNum, lOffset + flb.BasePathOffset, sBuf
              LinkInfo.BasePath = TrimNull(sBuf)
           End If
        End If
        If flb.Flags And 2 Then
           stringSize = 0
           If flb.LocalVolInfoOffset Then
              Get #fNum, lOffset + flb.NetVolInfoOffset, nvt
              stringSize = nvt.cbSize - nvt.ShareNameOffset
           End If
           If stringSize > 0 Then
              sBuf = Space(stringSize)
              Get #fNum, , sBuf
              LinkInfo.NetShareName = TrimNull(sBuf)
           End If
        End If
        If flb.RemainingPathOffset Then
           sBuf = Space(256)
           Get #fNum, lOffset + flb.BasePathOffset, sBuf
           LinkInfo.RemainPath = TrimNull(sBuf)
        End If
        lOffset = lOffset + flb.cbSize
        If hdr.Flags And hasDescription Then
           Get #fNum, lOffset, stringSize
           If isNT Then stringSize = stringSize * 2
           sBuf = Space(stringSize)
           Get #fNum, , sBuf
           If isNT Then sBuf = StrConv(sBuf, vbFromUnicode)
           LinkInfo.Description = TrimNull(sBuf)
           lOffset = lOffset + stringSize + 2
        End If
        If hdr.Flags And hasRelPath Then
           Get #fNum, lOffset, stringSize
           If isNT Then stringSize = stringSize * 2
           sBuf = Space(stringSize)
           Get #fNum, , sBuf
           If isNT Then sBuf = StrConv(sBuf, vbFromUnicode)
           LinkInfo.RelativePath = TrimNull(sBuf)
           lOffset = lOffset + stringSize + 2
        End If
        If hdr.Flags And hasWorkingDir Then
           Get #fNum, lOffset, stringSize
           If isNT Then stringSize = stringSize * 2
           sBuf = Space(stringSize)
           Get #fNum, , sBuf
           If isNT Then sBuf = StrConv(sBuf, vbFromUnicode)
           LinkInfo.WorkingDirectory = TrimNull(sBuf)
           lOffset = lOffset + stringSize + 2
        End If
        If hdr.Flags And hasCommandLine Then
           Get #fNum, lOffset, stringSize
           If isNT Then stringSize = stringSize * 2
           sBuf = Space(stringSize)
           Get #fNum, , sBuf
           If isNT Then sBuf = StrConv(sBuf, vbFromUnicode)
           LinkInfo.CommandLine = TrimNull(sBuf)
           lOffset = lOffset + stringSize + 2
        End If
        If hdr.Flags And hasIcon Then
           Get #fNum, lOffset, stringSize
           If isNT Then stringSize = stringSize * 2
           sBuf = Space(stringSize)
           Get #fNum, , sBuf
           If isNT Then sBuf = StrConv(sBuf, vbFromUnicode)
           LinkInfo.IconFile = TrimNull(sBuf)
           lOffset = lOffset + stringSize + 2
        End If
    Close #fNum
    GetLinkInfo = LinkInfo
End Function

Private Function TrimNull(startstr As String) As String
   Dim pos As Integer
   pos = InStr(startstr, Chr$(0))
   If pos Then
      TrimNull = Left$(startstr, pos - 1)
      Exit Function
   End If
   TrimNull = startstr
End Function

Private Function IsWindowsNT() As Boolean
   IsWindowsNT = Len(Environ$("OS"))
End Function

Private Function FileTimeToVBDate(ft As FILETIME) As Date
  Dim st As SYSTEMTIME
  FileTimeToSystemTime ft, st
  FileTimeToVBDate = DateSerial(st.wYear, st.wMonth, st.wDay) + _
                     TimeSerial(st.wHour, st.wMinute, st.wSecond)
 
End Function

'=========Form code============
Private Sub Command1_Click()
  Dim FileName As String
  FileName = "C:\Documents and Settings\ark\Desktop\totalcmd.lnk"
  With GetLinkInfo(FileName)
       Debug.Print "BasePath         = "; .BasePath
       Debug.Print "RemainPath       = "; .RemainPath
       Debug.Print "FileLength       = "; Format(.FileLength, "###,###,###,### bytes")
       Debug.Print "Attributes       = "; .Attributes & " (" & TranslateAttributes(.Attributes) & ")"
       Debug.Print "IconNum          ="; .IconNum
       Debug.Print "ShowWndConst     = "; .ShowWndConst & " (" & TranslateShowWnd(.ShowWndConst) & ")"
       Debug.Print "HotKey           ="; .HotKey
       Debug.Print "DateCreated      = "; .DateCreated
       Debug.Print "DateModified     = "; .DateModified
       Debug.Print "DateLastAccess   = "; .DateLastAccess
       Debug.Print "VolumeLabel      = "; .VolumeLabel
       Debug.Print "VolumeSerial     = "; .VolumeSerial
       Debug.Print "VolumeType       = "; .VolumeType
       Debug.Print "NetShareName     = "; .NetShareName
       Debug.Print "Description      = "; .Description
       Debug.Print "RelativePath     = "; .RelativePath
       Debug.Print "WorkingDirectory = "; .WorkingDirectory
       Debug.Print "CommandLine      = "; .CommandLine
       Debug.Print "IconFile         = "; .IconFile
  End With
End Sub

Private Function TranslateAttributes(ByVal attr As Long) As String
   Dim s As String
   If attr And &H1 Then s = s & "Read Only, "
   If attr And &H2 Then s = s & "Hidden, "
   If attr And &H4 Then s = s & "System, "
   If attr And &H8 Then s = s & "Volume, "
   If attr And &H10 Then s = s & "Directory, "
   If attr And &H20 Then s = s & "Archive, "
   If attr And &H40 Then s = s & "Alias (or NTFS encripted), "
   If attr And &H80 Then s = s & "Normal, " '???
   If attr And &H100 Then s = s & "Temporary, "
   If attr And &H200 Then s = s & "Sparse file, "
   If attr And &H400 Then s = s & "Has reparse point, "
   If attr And &H800 Then s = s & "Compressed, "
   If attr And &H1000 Then s = s & "Offline, "
   If s = "" Then s = "Normal" Else s = Left(s, Len(s) - 2)
   TranslateAttributes = s
End Function

Private Function TranslateShowWnd(ByVal sw As Long) As String
   Select Case sw
       Case 0:  TranslateShowWnd = "SW_HIDE"   'Cool for shortcut :)
       Case 1:  TranslateShowWnd = "SW_NORMAL"
       Case 2:  TranslateShowWnd = "SW_SHOWMINIMIZED"
       Case 3:  TranslateShowWnd = "SW_SHOWMAXIMIZED"
       Case 4:  TranslateShowWnd = "SW_SHOWNOACTIVATE"
       Case 5:  TranslateShowWnd = "SW_SHOW"
       Case 6:  TranslateShowWnd = "SW_MINIMIZE"
       Case 7:  TranslateShowWnd = "SW_SHOWMINNOACTIVE"
       Case 8:  TranslateShowWnd = "SW_SHOWNA"
       Case 9:  TranslateShowWnd = "SW_RESTORE"
       Case 10: TranslateShowWnd = "SW_SHOWDEFAULT"
   End Select
End Function

Regards
Ark
0
 
LVL 1

Author Comment

by:Sector10
ID: 13892615
Hello ARK!

CLAPS, CLAPS!

If you could see me know, i am walking around with a big smile on my face.
This is more than i could hope for! It is really a great piece of coding.

It is because of guys like you that my knowledge of programming in visual basic is growing day after day, and i want to thank you for
helping me out on this one.

Regards to you all

Paul
0
 
LVL 28

Expert Comment

by:Ark
ID: 13892635
Hello, Paul
Thanks for point, glad I could help you.
As for MCRIDER's code - I'm sure it works for Win9x OK. But he hardcoded offsets in his code, while NT use Unicode strings for Description, Working dir etc. In this case offsets are 2 times bigger. If you're interesting, you can find .lnk file description here http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf (though there is still old Win9x description stating that all string are ASCII format)
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Suggested Courses
Course of the Month20 days, 15 hours left to enroll

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question