C++ 从Windows文件资源管理器的地址栏检索路径
我和我的团队正在开发一个应用程序,从windows文件资源管理器的地址栏中获取路径。我们需要一个程序,可以获得当前在Windows资源管理器的地址栏中打开的位置的路径。我们尝试了MSDN上提供的以下程序以实现相同的目标-。 该程序的代码如下所示-C++ 从Windows文件资源管理器的地址栏检索路径,c++,windows,shell,C++,Windows,Shell,我和我的团队正在开发一个应用程序,从windows文件资源管理器的地址栏中获取路径。我们需要一个程序,可以获得当前在Windows资源管理器的地址栏中打开的位置的路径。我们尝试了MSDN上提供的以下程序以实现相同的目标-。 该程序的代码如下所示- #include <shlobj.h> #include <exdisp.h> #include <iostream> #include <wingdi.h> using namespace std;
#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;
}
我们使用DEV C++版本5.11,编译器TDMGCC 4.92. 64位发布。p> 不确定GCC编译器是否知道包含COM外壳引用的正确宏的可能重复。尝试使用Visual Studio编译器,查看您的程序是否使用该编译器进行编译。请删除标记,因为它与此问题无关。抱歉。看来SO iOS应用程序没有编辑最新版本的帖子。谢谢你把它修好。
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