See the question and my original answer on StackOverflow

If you're going for undocumented stuff, here is a code that can dump an MRU list like the LastVisitedPidlMRU one:

// the Shell object that can read MRU lists
static GUID CLSID_MruLongList = { 0x53bd6b4e,0x3780,0x4693,{0xaf,0xc3,0x71,0x61,0xc2,0xf3,0xee,0x9c} };

typedef enum MRULISTF
{
  MRULISTF_USE_MEMCMP = 0x0,
  MRULISTF_USE_STRCMPIW = 0x1,
  MRULISTF_USE_STRCMPW = 0x2,
  MRULISTF_USE_ILISEQUAL = 0x3,
};

typedef int (__stdcall *MRUDATALISTCOMPARE)(const BYTE*, const BYTE*, int);

MIDL_INTERFACE("00000000-0000-0000-0000-000000000000") // unknown guid but we don't care
IMruDataCompare : public IUnknown
{
public:
  virtual HRESULT CompareItems(const BYTE*, int, const BYTE*, int) = 0;
};

MIDL_INTERFACE("d2c22919-91f5-4284-8807-58a2d64e561c")
IMruDataList2 : public IUnknown
{
public:
  virtual HRESULT InitData(UINT uMax, MRULISTF flags, HKEY hKey, LPCWSTR pszSubKey, MRUDATALISTCOMPARE pfnCompare) = 0;
  virtual HRESULT AddData(const BYTE* pData, DWORD cbData, DWORD* pdwSlot) = 0;
  virtual HRESULT InsertData(const BYTE*, DWORD cbData, int* piIndex, DWORD* pdwSlot) = 0;
  virtual HRESULT FindData(const BYTE* pData, DWORD cbData, int* piIndex) = 0;
  virtual HRESULT GetData(int iIndex, BYTE* pData, DWORD cbData) = 0;
  virtual HRESULT QueryInfo(int iIndex, DWORD* pdwSlot, DWORD* pcbData) = 0;
  virtual HRESULT Delete(int iIndex) = 0;
  virtual HRESULT InitData2(UINT uMax, MRULISTF flags, HKEY hKey, LPCWSTR pszSubKey, IMruDataCompare* pfnCompare) = 0;
};

int main()
{
  CoInitialize(NULL);
  {
    CComPtr<IMruDataList2> mru;
    if (SUCCEEDED(mru.CoCreateInstance(CLSID_MruLongList)))
    {
      const int max = 100; // get max 100 entries
      mru->InitData(max, MRULISTF_USE_MEMCMP, HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\LastVisitedPidlMRU\\", nullptr);
      for (auto i = 0; i < max; i++)
      {
        DWORD slot;
        DWORD size;
        // get size
        if (FAILED(mru->QueryInfo(i, &slot, &size)))
          continue;

        // get data
        // note beginning is a LPWSTR containing exe data
        auto data = (LPBYTE)_alloca(size);
        if (FAILED(mru->GetData(i, data, size)))
          continue;

        // the rest is a PIDL
        auto pidl = (LPCITEMIDLIST)(data + (lstrlen((LPWSTR)data) + 1) * 2);

        // get the shell item
        CComPtr<IShellItem> item;
        if (SUCCEEDED(SHCreateItemFromIDList(pidl, IID_PPV_ARGS(&item))))
        {
          // get its path
          CComHeapPtr<WCHAR> path;
          item->GetDisplayName(SIGDN::SIGDN_DESKTOPABSOLUTEPARSING, &path);
          wprintf(L"Executable: %s LastVisited: %s\n", data, path);
        }
      }
    }
  }
  CoUninitialize();
}

PS: I'm using ATL's smart classes