0

I and my team are developing an application to fetch a path from Adress bar of windows file explorer. We need a program that could get the path of currently opened location in the address bar of Windows Explorer. We have tried the following program given on MSDN to achieve the same - Link. The code for the program is as follows -

#include <shlobj.h>
#include <exdisp.h>
#include <iostream>
#include <wingdi.h>
using namespace std;

TCHAR g_szPath[MAX_PATH];
TCHAR g_szItem[MAX_PATH];

void CALLBACK RecalcText(HWND hwnd, UINT, UINT_PTR, DWORD)
{

 HWND hwndFind = GetForegroundWindow();
 g_szPath[0] = TEXT('\0');
 g_szItem[0] = TEXT('\0');

 IShellWindows *psw;
 if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw)))
    {
        VARIANT v;
        V_VT(&v) = VT_I4;
        IDispatch  *pdisp;
        BOOL fFound = FALSE;
        for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK; V_I4(&v)++) 
            {
            IWebBrowserApp *pwba;
            if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba)))
               {
                HWND hwndWBA;
                if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind) 
                    {
                    fFound = TRUE;
                    IServiceProvider *psp;
                    if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp)))
                        {
                        IShellBrowser *psb;
                        if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&psb)))
                            {
                            IShellView *psv;
                            if (SUCCEEDED(psb->QueryActiveShellView(&psv))) 
                               {
                                IFolderView *pfv;
                                if (SUCCEEDED(psv->QueryInterface(IID_IFolderView, (void**)&pfv))) 
                                    {
                                    IPersistFolder2 *ppf2;
                                    if (SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2, (void**)&ppf2)))
                                        {
                                        LPITEMIDLIST pidlFolder;
                                        if (SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) 
                                            {
                                            if (!SHGetPathFromIDList(pidlFolder, g_szPath)) 
                                                {
                                                lstrcpyn(g_szPath, TEXT("<not a directory>"), MAX_PATH);  // Path is received here
                                                }
                                            int iFocus;
                                            if (SUCCEEDED(pfv->GetFocusedItem(&iFocus))) 
                                                {
                                                LPITEMIDLIST pidlItem;
                                                if (SUCCEEDED(pfv->Item(iFocus, &pidlItem))) 
                                                    {
                                                    IShellFolder *psf;
                                                    if (SUCCEEDED(ppf2->QueryInterface(IID_IShellFolder, (void**)&psf))) 
                                                        {
                                                        STRRET str;
                                                        if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem,SHGDN_INFOLDER,&str)))
                                                            {
                                                            //StrRetToBuf(&str, pidlItem, g_szItem, MAX_PATH);
                                                            }
                                                        psf->Release();
                                                        }
                                                    CoTaskMemFree(pidlItem);
                                                    }
                                                }
                                                CoTaskMemFree(pidlFolder);
                                            }
                                        ppf2->Release();
                                        }
                                    pfv->Release();
                                    }
                                psv->Release();
                                }
                            psb->Release();
                            }
                        psp->Release();
                        }
                    }
                pwba->Release();
                }
            pdisp->Release();
            }
    psw->Release();

     }
InvalidateRect(hwnd, NULL, TRUE);
}

BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpcs)
{

    SetTimer(hwnd, 1, 1000, RecalcText);

    return TRUE;
}


void PaintContent(HWND hwnd, PAINTSTRUCT *pps)
{
  TextOut(pps->hdc, 0, 0, g_szPath, lstrlen(g_szPath));
  TextOut(pps->hdc, 0, 20, g_szItem, lstrlen(g_szItem));
}

int main()
{
    return 0;
}

When we run this program, we are getting following error -

C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x41): undefined reference to `IID_IShellWindows'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x58): undefined reference to `CLSID_ShellWindows'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x5d): undefined reference to `_imp__CoCreateInstance@20'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0xa3): undefined reference to `IID_IWebBrowserApp'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x118): undefined reference to `IID_IServiceProvider'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x149): undefined reference to `IID_IShellBrowser'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x151): undefined reference to `SID_STopLevelBrowser'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x1aa): undefined reference to `IID_IFolderView'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x1db): undefined reference to `IID_IPersistFolder2'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x2cb): undefined reference to `IID_IShellFolder'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x32a): undefined reference to `_imp__CoTaskMemFree@4'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x33a): undefined reference to `_imp__CoTaskMemFree@4'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x4f8): undefined reference to `_imp__TextOutA@20'
C:\TEMP\ccksh7S1.o  Addressbar1.2.cpp:(.text+0x539): undefined reference to `_imp__TextOutA@20'
F:\C++\collect2.exe [Error] ld returned 1 exit status

We are using Dev C++ Version 5.11, compiler TDM-GCC 4.9.2 64-bit Release.

halfer
  • 19,824
  • 17
  • 99
  • 186
  • Possible duplicate of [What is an undefined reference/unresolved external symbol error and how do I fix it?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Rakete1111 Mar 18 '17 at 17:15
  • Not sure GCC compiler knows the right macros to include the COM shell references. Try with Visual Studio compiler and see if your program compiles using that. – gbjbaanb Mar 18 '17 at 17:22
  • Please remove the [tag:powershell] tag as it's got nothing to do with this question. – henrycarteruk Mar 18 '17 at 21:31
  • 1
    Sorry. Looks like the SO iOS app didn't edit the latest version of the post. Thanks for fixing it. – Frode F. Mar 18 '17 at 23:15

0 Answers0