hi,
ich versuche aus einem ordner mir alle dokumente auszulesen und den "Titel" den diese besitzen. Ich mein den Text den man sich bei der Detailansicht anzeigen lassen kann.
da ich leider wirklich fast keine ahnung von COM oder shell habe, hänge ich etwas hilflos in der luft herum
hab mir durch programmschnipsel geschaft eine anwendung zusammen zu suchen, die mir alles ausliest bis eben diese besage information. ich schaffe es mir dokumentenname, erstellungs-, änderungs-, letzeszugriffsdatum auszulesen sowie den dokumentyp, aber nicht den titel.
hier mal mein Code, was mach ich falsch, jemand neinen tipp was ich machen muss um an den dokumentitel zu kommen?
habe mir einfach mal alles ausgeben lassen, über das ich die ID nummern des Befehls GetDetailsOf(pidl, 8, &sd) dran komme, aber schon ab ID 7 liefert die Funktion S_FALSE zurück.
ich versuche aus einem ordner mir alle dokumente auszulesen und den "Titel" den diese besitzen. Ich mein den Text den man sich bei der Detailansicht anzeigen lassen kann.
da ich leider wirklich fast keine ahnung von COM oder shell habe, hänge ich etwas hilflos in der luft herum
hab mir durch programmschnipsel geschaft eine anwendung zusammen zu suchen, die mir alles ausliest bis eben diese besage information. ich schaffe es mir dokumentenname, erstellungs-, änderungs-, letzeszugriffsdatum auszulesen sowie den dokumentyp, aber nicht den titel.
hier mal mein Code, was mach ich falsch, jemand neinen tipp was ich machen muss um an den dokumentitel zu kommen?
habe mir einfach mal alles ausgeben lassen, über das ich die ID nummern des Befehls GetDetailsOf(pidl, 8, &sd) dran komme, aber schon ab ID 7 liefert die Funktion S_FALSE zurück.
PHP Code:
// ListDirCon.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include "windows.h"
#include "shlobj.h"
#include <iostream>
using namespace std;
int _tmain(int argc, TCHAR* argv[])
{
char path[MAX_PATH] = "C:\\temp\\test";
HRESULT hr;
IShellFolder * isfDesktop = NULL;
IShellFolder2 * isfCur = NULL;
hr = CoInitialize(NULL); // initialize COM
LPMALLOC pMalloc = NULL; // memory manager, for freeing up PIDLs
hr = SHGetMalloc(&pMalloc);
hr = SHGetDesktopFolder(&isfDesktop);
isfDesktop->QueryInterface(IID_IShellFolder2, (LPVOID*)&isfCur);
// IShellFolder::ParseDisplayName requires the path name in Unicode.
OLECHAR olePath[MAX_PATH]; // wide-char version of path name
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, path, -1, olePath, MAX_PATH);
// parse path for absolute PIDL, and connect to target folder
LPITEMIDLIST pidl = NULL; // general purpose
hr = isfDesktop->ParseDisplayName(NULL, NULL, olePath, NULL, &pidl, NULL);
LPSHELLFOLDER psfFolder = NULL;
hr = isfDesktop->BindToObject(pidl, NULL, IID_IShellFolder,
(void**)&psfFolder);
isfDesktop->Release(); // no longer required
pMalloc->Free(pidl);
LPENUMIDLIST penumIDL = NULL; // IEnumIDList interface for reading contents
hr = psfFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
&penumIDL);
while(1) {
// retrieve a copy of next local item ID list
hr = penumIDL->Next(1, &pidl, NULL);
if(hr == NOERROR) {
WIN32_FIND_DATA ffd;
hr = SHGetDataFromIDList(psfFolder, pidl, SHGDFIL_FINDDATA, &ffd,
sizeof(WIN32_FIND_DATA));
SHELLDETAILS sd;
hr = isfCur->GetDetailsOf(pidl, 0, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 1, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 2, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 3, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 4, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 5, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 6, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 7, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 8, &sd);
wcout<<sd.str.pOleStr<<endl;
hr = isfCur->GetDetailsOf(pidl, 9, &sd);
wcout<<sd.str.pOleStr<<endl;
wcout << L"Name = " << ffd.cFileName << endl;
wcout << L"Type = " << ( (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
? "dir\n" : "file\n" );
wcout << L"Size = " << ffd.nFileSizeLow << endl;
pMalloc->Free(pidl);
}
else break;
}
// release all remaining interface pointers
penumIDL->Release();
psfFolder->Release();
pMalloc->Release();
CoUninitialize(); // shut down COM
return 0;
}