diff --git a/reactos/subsys/system/explorer/Doxyfile b/reactos/subsys/system/explorer/Doxyfile
index 4d3b1ec49c0..7deb581608f 100644
--- a/reactos/subsys/system/explorer/Doxyfile
+++ b/reactos/subsys/system/explorer/Doxyfile
@@ -136,8 +136,8 @@ LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
-COMPACT_RTF = NO
-RTF_HYPERLINKS = NO
+COMPACT_RTF = YES
+RTF_HYPERLINKS = YES
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
diff --git a/reactos/subsys/system/explorer/buildno.h b/reactos/subsys/system/explorer/buildno.h
index 6c6d3a727b7..25196adecb0 100644
--- a/reactos/subsys/system/explorer/buildno.h
+++ b/reactos/subsys/system/explorer/buildno.h
@@ -1,11 +1,11 @@
/* Do not edit - Machine generated */
#ifndef _INC_REACTOS_BUILDNO
#define _INC_REACTOS_BUILDNO
-#define KERNEL_VERSION_BUILD 23
-#define KERNEL_VERSION_BUILD_STR "23"
-#define KERNEL_RELEASE_RC "0.1.4.23\0"
-#define KERNEL_RELEASE_STR "0.1.4.23"
-#define KERNEL_VERSION_RC "0.1.4\0"
-#define KERNEL_VERSION_STR "0.1.4"
+#define KERNEL_VERSION_BUILD 0
+#define KERNEL_VERSION_BUILD_STR "0"
+#define KERNEL_RELEASE_RC "0.1.5.0\0"
+#define KERNEL_RELEASE_STR "0.1.5.0"
+#define KERNEL_VERSION_RC "0.1.5\0"
+#define KERNEL_VERSION_STR "0.1.5"
#endif
/* EOF */
diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html
index 53eb14281eb..4584130f50e 100644
--- a/reactos/subsys/system/explorer/doxy-footer.html
+++ b/reactos/subsys/system/explorer/doxy-footer.html
@@ -3,7 +3,7 @@
ROS Explore Source Code Documentation
- generated on 10.11.2003 by
+ generated on 15.11.2003 by
|
diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp
index 39a31eaacc5..42f1c8be86e 100644
--- a/reactos/subsys/system/explorer/explorer.cpp
+++ b/reactos/subsys/system/explorer/explorer.cpp
@@ -130,6 +130,8 @@ void explorer_show_frame(HWND hwndDesktop, int cmdshow)
static void InitInstance(HINSTANCE hInstance)
{
+ CONTEXT("InitInstance");
+
setlocale(LC_COLLATE, ""); // set collating rules to local settings for compareName
// register frame window class
@@ -147,6 +149,8 @@ static void InitInstance(HINSTANCE hInstance)
int explorer_main(HINSTANCE hInstance, HWND hwndDesktop, int cmdshow)
{
+ CONTEXT("explorer_main");
+
// initialize COM and OLE
OleInit usingCOM;
@@ -185,6 +189,8 @@ int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
int main(int argc, char* argv[])
{
+ CONTEXT("main");
+
STARTUPINFO startupinfo;
int nShowCmd = SW_SHOWNORMAL;
@@ -201,6 +207,8 @@ int main(int argc, char* argv[])
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{
+ CONTEXT("WinMain()");
+
// create desktop window and task bar only, if there is no other shell and we are
// the first explorer instance
BOOL startup_desktop = !IsAnyDesktopRunning();
diff --git a/reactos/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp
index 128882f39b9..4adb55c65e6 100644
--- a/reactos/subsys/system/explorer/utility/shellclasses.cpp
+++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp
@@ -62,16 +62,35 @@ LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count)
}
+Context Context::s_main(TEXT("-NO-CONTEXT-"));
+Context* Context::s_current = &Context::s_main;
+
+
// Exception Handler for COM exceptions
void HandleException(COMException& e, HWND hwnd)
{
SetLastError(0);
- MessageBox(hwnd, e.ErrorMessage(), TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK);
+ String msg = e.ErrorMessage();
+ if (e._ctx) {
+ TCHAR buffer[BUFFER_LEN];
+ _stprintf(buffer, TEXT("%s\nContext: %s"), (LPCTSTR)msg, e._ctx);
+ msg = buffer;
+ }
+
+ if (!e._obj.empty()) {
+ TCHAR buffer[BUFFER_LEN];
+ _stprintf(buffer, TEXT("%s\nObject: %s"), (LPCTSTR)msg, (LPCTSTR)e._obj);
+ msg = buffer;
+ }
+
+ MessageBox(hwnd, msg, TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK);
+
+ // If displaying the error message box _with_ parent was not successfull, display it now without a parent window.
if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
- MessageBox(0, e.ErrorMessage(), TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK);
+ MessageBox(0, msg, TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK);
}
@@ -95,6 +114,8 @@ ShellFolder& Desktop()
void CommonDesktop::init()
{
+ CONTEXT("CommonDesktop::init()");
+
if (!_desktop)
_desktop = new ShellFolder;
}
@@ -122,6 +143,8 @@ HRESULT path_from_pidlA(IShellFolder* folder, LPCITEMIDLIST pidl, LPSTR buffer,
HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer, int len)
{
+ CONTEXT("path_from_pidlW()");
+
StrRetW str;
HRESULT hr = folder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &str);
@@ -136,6 +159,8 @@ HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer,
HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags)
{
+ CONTEXT("name_from_pidl()");
+
StrRet str;
HRESULT hr = folder->GetDisplayNameOf(pidl, flags, &str);
@@ -153,6 +178,8 @@ HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer,
ShellFolder::ShellFolder()
{
+ CONTEXT("ShellFolder::ShellFolder()");
+
IShellFolder* desktop;
CheckError(SHGetDesktopFolder(&desktop));
@@ -164,11 +191,15 @@ ShellFolder::ShellFolder()
ShellFolder::ShellFolder(IShellFolder* p)
: super(p)
{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*)");
+
p->AddRef();
}
ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
IShellFolder* ptr;
if (!pidl)
@@ -185,6 +216,8 @@ ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)");
+
IShellFolder* ptr;
IShellFolder* parent = Desktop();
@@ -199,6 +232,8 @@ ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::attach(IShellFolder*, LPCITEMIDLIST)");
+
IShellFolder* ptr;
if (pidl && pidl->mkid.cb)
@@ -214,6 +249,8 @@ void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
ShellFolder::ShellFolder()
{
+ CONTEXT("ShellFolder::ShellFolder()");
+
CheckError(SHGetDesktopFolder(&_p));
_p->AddRef();
@@ -222,11 +259,15 @@ ShellFolder::ShellFolder()
ShellFolder::ShellFolder(IShellFolder* p)
: super(p)
{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*)");
+
_p->AddRef();
}
ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
if (pidl && pidl->mkid.cb)
CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
else
@@ -237,6 +278,8 @@ ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)");
+
if (pidl && pidl->mkid.cb)
CheckError(Desktop()->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
else
@@ -247,6 +290,8 @@ ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
IShellFolder* h = _p;
CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
@@ -259,6 +304,8 @@ void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
String ShellFolder::get_name(LPCITEMIDLIST pidl, SHGDNF flags) const
{
+ CONTEXT("ShellFolder::get_name()");
+
TCHAR buffer[MAX_PATH];
StrRet strret;
@@ -299,6 +346,8 @@ void ShellPath::split(ShellPath& parent, ShellPath& obj) const
void ShellPath::GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd, ShellFolder& sf)
{
+ CONTEXT("ShellPath::GetUIObjectOf()");
+
ShellPath parent, obj;
split(parent, obj);
@@ -317,6 +366,8 @@ void ShellPath::GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd, ShellFolde
// convert an item id list from relative to absolute (=relative to the desktop) format
ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const
{
+ CONTEXT("ShellPath::create_absolute_pidl()");
+
return ILCombine(parent_pidl, _p);
/* seems to work only for NT upwards
@@ -337,6 +388,8 @@ ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const
ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const
{
+ CONTEXT("ShellPath::create_absolute_pidl()");
+
static DynamicFct ILCombine(TEXT("SHELL32"), 25);
if (ILCombine)
diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h
index 575dbc35b4d..123640be7c9 100644
--- a/reactos/subsys/system/explorer/utility/shellclasses.h
+++ b/reactos/subsys/system/explorer/utility/shellclasses.h
@@ -50,14 +50,14 @@ using namespace _com_util;
#ifndef _NO_COMUTIL
-#define COMException _com_error
+#define COMExceptionBase _com_error
#else
- /// COM Exception class as replacement for _com_error
-struct COMException
+ /// COM ExceptionBase class as replacement for _com_error
+struct COMExceptionBase
{
- COMException(HRESULT hr)
+ COMExceptionBase(HRESULT hr)
: _hr(hr)
{
}
@@ -91,6 +91,59 @@ protected:
mutable String _msg;
};
+#endif
+
+
+struct Context
+{
+ Context(LPCTSTR ctx)
+ : _ctx(ctx)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ ~Context()
+ {
+ s_current = _last;
+ }
+
+ LPCTSTR _ctx;
+ Context* _last;
+
+ static Context* s_current;
+ static Context s_main;
+};
+
+#define CONTEXT(x) Context __ctx__(TEXT(x))
+
+
+ /// COM Exception with context information
+
+struct COMException : public COMExceptionBase
+{
+ typedef COMExceptionBase super;
+
+ COMException(HRESULT hr)
+ : super(hr)
+ {
+ _ctx = Context::s_current->_ctx;
+ }
+
+ COMException(HRESULT hr, const String& obj)
+ : super(hr),
+ _obj(obj)
+ {
+ _ctx = Context::s_current->_ctx;
+ }
+
+ LPCTSTR _ctx;
+ String _obj;
+};
+
+
+#ifdef _NO_COMUTIL
+
inline void CheckError(HRESULT hr)
{
if (FAILED(hr)) {
@@ -485,6 +538,8 @@ struct ShellPath : public SShellPtr
ShellPath(IShellFolder* folder, LPCWSTR path)
{
+ CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCWSTR)");
+
if (path) {
ULONG l;
CheckError(folder->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
@@ -494,6 +549,8 @@ struct ShellPath : public SShellPtr
ShellPath(LPCWSTR path)
{
+ CONTEXT("ShellPath::ShellPath(LPCWSTR)");
+
if (path) {
ULONG l;
CheckError(Desktop()->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
@@ -503,6 +560,8 @@ struct ShellPath : public SShellPtr
ShellPath(IShellFolder* folder, LPCSTR path)
{
+ CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCSTR)");
+
ULONG l;
WCHAR b[MAX_PATH];
@@ -515,6 +574,8 @@ struct ShellPath : public SShellPtr
ShellPath(LPCSTR path)
{
+ CONTEXT("ShellPath::ShellPath(LPCSTR)");
+
ULONG l;
WCHAR b[MAX_PATH];
@@ -528,6 +589,8 @@ struct ShellPath : public SShellPtr
ShellPath(const ShellPath& o)
: super(NULL)
{
+ //CONTEXT("ShellPath::ShellPath(const ShellPath&)");
+
if (o._p) {
int l = ILGetSize(o._p);
_p = (ITEMIDLIST*) _malloc->Alloc(l);
@@ -542,6 +605,8 @@ struct ShellPath : public SShellPtr
ShellPath(LPCITEMIDLIST p)
{
+ //CONTEXT("ShellPath::ShellPath(LPCITEMIDLIST)");
+
if (p) {
int l = ILGetSize(p);
_p = (ITEMIDLIST*) _malloc->Alloc(l);
@@ -551,6 +616,8 @@ struct ShellPath : public SShellPtr
void operator=(const ShellPath& o)
{
+ //CONTEXT("ShellPath::operator=(const ShellPath&)");
+
ITEMIDLIST* h = _p;
if (o._p) {
@@ -567,6 +634,8 @@ struct ShellPath : public SShellPtr
void operator=(ITEMIDLIST* p)
{
+ //CONTEXT("ShellPath::operator=(ITEMIDLIST*)");
+
ITEMIDLIST* h = _p;
if (p) {
@@ -608,6 +677,8 @@ struct ShellPath : public SShellPtr
void assign(LPCITEMIDLIST pidl, size_t size)
{
+ //CONTEXT("ShellPath::assign(LPCITEMIDLIST, size_t)");
+
ITEMIDLIST* h = _p;
_p = (ITEMIDLIST*) _malloc->Alloc(size+sizeof(USHORT/*SHITEMID::cb*/));
@@ -622,6 +693,8 @@ struct ShellPath : public SShellPtr
void assign(LPCITEMIDLIST pidl)
{
+ //CONTEXT("ShellPath::assign(LPCITEMIDLIST)");
+
ITEMIDLIST* h = _p;
if (pidl) {
@@ -837,6 +910,8 @@ struct SpecialFolderFSPath : public FileSysShellPath
{
SpecialFolderFSPath(int folder, HWND hwnd)
{
+ CONTEXT("SpecialFolderFSPath::SpecialFolderFSPath()");
+
HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p);
CheckError(hr);
}
@@ -851,6 +926,8 @@ struct ShellItemEnumerator : public SIfacePtr
{
ShellItemEnumerator(IShellFolder* folder, DWORD flags=SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN)
{
+ CONTEXT("ShellItemEnumerator::ShellItemEnumerator()");
+
CheckError(folder->EnumObjects(0, flags, &_p));
}
};