diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html
index 4584130f50e..18cdb013ca5 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 15.11.2003 by
+ generated on 23.11.2003 by
|
diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp
index 42f1c8be86e..87e89f5b42b 100644
--- a/reactos/subsys/system/explorer/explorer.cpp
+++ b/reactos/subsys/system/explorer/explorer.cpp
@@ -70,7 +70,7 @@ ResString::ResString(UINT nid)
int len = LoadString(g_Globals._hInstance, nid, buffer, sizeof(buffer)/sizeof(TCHAR));
- assign(buffer, len);
+ super::assign(buffer, len);
}
diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp
index feba1fb074e..12bddd74a3b 100644
--- a/reactos/subsys/system/explorer/shell/mainframe.cpp
+++ b/reactos/subsys/system/explorer/shell/mainframe.cpp
@@ -340,6 +340,8 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
int MainFrame::Command(int id, int code)
{
+ CONTEXT("MainFrame::Command()");
+
#ifndef _NO_MDI
HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
@@ -426,6 +428,8 @@ int MainFrame::Command(int id, int code)
ExecuteDialog dlg = {{0}, 0};
if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) {
+ CONTEXT("ShellExecute()");
+
HINSTANCE hinst = ShellExecute(_hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow);
if ((int)hinst <= 32)
diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp
index ebfc0b0f3a3..36b7dee7631 100644
--- a/reactos/subsys/system/explorer/shell/shellfs.cpp
+++ b/reactos/subsys/system/explorer/shell/shellfs.cpp
@@ -145,6 +145,8 @@ void ShellDirectory::get_path(PTSTR path) const
BOOL ShellEntry::launch_entry(HWND hwnd, UINT nCmdShow)
{
+ CONTEXT("ShellEntry::launch_entry()");
+
SHELLEXECUTEINFO shexinfo;
shexinfo.cbSize = sizeof(SHELLEXECUTEINFO);
diff --git a/reactos/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp
index 4adb55c65e6..88152839ec3 100644
--- a/reactos/subsys/system/explorer/utility/shellclasses.cpp
+++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp
@@ -70,22 +70,26 @@ Context* Context::s_current = &Context::s_main;
void HandleException(COMException& e, HWND hwnd)
{
+ TCHAR msg[4*BUFFER_LEN];
+ LPTSTR p = msg;
+
+ p += _stprintf(TEXT("%s"), e.ErrorMessage());
+
+ if (e._ctx)
+ p += _stprintf(p, TEXT("\nContext: %s"), e._ctx);
+
+ if (!e._obj.empty())
+ p += _stprintf(p, TEXT("\nObject: %s"), (LPCTSTR)e._obj);
+
+ if (e._file)
+#ifdef UNICODE
+ p += _stprintf(p, TEXT("\nLocation: %hs(%d)"), e._file, e._line);
+#else
+ p += _stprintf(p, TEXT("\nLocation: %s(%d)"), e._file, e._line);
+#endif
+
SetLastError(0);
- 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.
@@ -182,7 +186,7 @@ ShellFolder::ShellFolder()
IShellFolder* desktop;
- CheckError(SHGetDesktopFolder(&desktop));
+ CHECKERROR(SHGetDesktopFolder(&desktop));
super::Attach(desktop);
desktop->AddRef();
@@ -203,10 +207,10 @@ ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
IShellFolder* ptr;
if (!pidl)
- CheckError(E_INVALIDARG);
+ CHECKERROR(E_INVALIDARG);
if (pidl && pidl->mkid.cb)
- CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
else
ptr = parent;
@@ -222,7 +226,7 @@ ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
IShellFolder* parent = Desktop();
if (pidl && pidl->mkid.cb)
- CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
else
ptr = parent;
@@ -237,7 +241,7 @@ void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
IShellFolder* ptr;
if (pidl && pidl->mkid.cb)
- CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
else
ptr = parent;
@@ -251,7 +255,7 @@ ShellFolder::ShellFolder()
{
CONTEXT("ShellFolder::ShellFolder()");
- CheckError(SHGetDesktopFolder(&_p));
+ CHECKERROR(SHGetDesktopFolder(&_p));
_p->AddRef();
}
@@ -269,7 +273,7 @@ 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));
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
else
_p = Desktop();
@@ -281,7 +285,7 @@ ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)");
if (pidl && pidl->mkid.cb)
- CheckError(Desktop()->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
+ CHECKERROR(Desktop()->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
else
_p = Desktop();
@@ -294,7 +298,7 @@ void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
IShellFolder* h = _p;
- CheckError(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
_p->AddRef();
h->Release();
@@ -314,7 +318,7 @@ String ShellFolder::get_name(LPCITEMIDLIST pidl, SHGDNF flags) const
if (hr == S_OK)
strret.GetString(pidl->mkid, buffer, MAX_PATH);
else {
- CheckError(hr);
+ CHECKERROR(hr);
*buffer = TEXT('\0');
}
@@ -356,9 +360,9 @@ void ShellPath::GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd, ShellFolde
if (parent && parent->mkid.cb)
// use the IShellFolder of the parent
- CheckError(ShellFolder((IShellFolder*)sf,parent)->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
+ CHECKERROR(ShellFolder((IShellFolder*)sf,parent)->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
else // else use desktop folder
- CheckError(sf->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
+ CHECKERROR(sf->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
}
#ifndef __MINGW32__ // ILCombine() is currently missing in MinGW.
diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h
index 123640be7c9..980492cb652 100644
--- a/reactos/subsys/system/explorer/utility/shellclasses.h
+++ b/reactos/subsys/system/explorer/utility/shellclasses.h
@@ -94,30 +94,6 @@ protected:
#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
@@ -125,30 +101,54 @@ struct COMException : public COMExceptionBase
typedef COMExceptionBase super;
COMException(HRESULT hr)
- : super(hr)
+ : super(hr),
+ _ctx(Context::current()._ctx),
+ _obj(Context::current()._obj),
+ _file(NULL), _line(0)
+ {
+ }
+
+ COMException(HRESULT hr, const char* file, int line)
+ : super(hr),
+ _ctx(Context::current()._ctx),
+ _obj(Context::current()._obj),
+ _file(file), _line(line)
{
- _ctx = Context::s_current->_ctx;
}
COMException(HRESULT hr, const String& obj)
: super(hr),
- _obj(obj)
+ _ctx(Context::current()._ctx),
+ _obj(obj),
+ _file(NULL), _line(0)
+ {
+ _ctx = Context::current()._ctx;
+ }
+
+ COMException(HRESULT hr, const String& obj, const char* file, int line)
+ : super(hr),
+ _ctx(Context::current()._ctx),
+ _obj(obj),
+ _file(file), _line(line)
{
- _ctx = Context::s_current->_ctx;
}
LPCTSTR _ctx;
String _obj;
+
+ const char* _file;
+ int _line;
};
+#define CHECKERROR(hr) ((void)(FAILED(hr)? throw COMException(hr, __FILE__, __LINE__): 0))
+
#ifdef _NO_COMUTIL
inline void CheckError(HRESULT hr)
{
- if (FAILED(hr)) {
+ if (FAILED(hr))
throw COMException(hr);
- }
}
#endif
@@ -160,13 +160,13 @@ struct ComInit
{
ComInit()
{
- CheckError(CoInitialize(0));
+ CHECKERROR(CoInitialize(0));
}
#if (_WIN32_WINNT>=0x0400) || defined(_WIN32_DCOM)
ComInit(DWORD flag)
{
- CheckError(CoInitializeEx(0, flag));
+ CHECKERROR(CoInitializeEx(0, flag));
}
#endif
@@ -183,7 +183,7 @@ struct OleInit
{
OleInit()
{
- CheckError(OleInitialize(0));
+ CHECKERROR(OleInitialize(0));
}
~OleInit()
@@ -210,7 +210,7 @@ struct CommonShellMalloc
void init()
{
if (!_p)
- CheckError(SHGetMalloc(&_p));
+ CHECKERROR(SHGetMalloc(&_p));
}
~CommonShellMalloc()
@@ -542,18 +542,18 @@ struct ShellPath : public SShellPtr
if (path) {
ULONG l;
- CheckError(folder->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
+ CHECKERROR(folder->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
} else
_p = NULL;
}
ShellPath(LPCWSTR path)
{
- CONTEXT("ShellPath::ShellPath(LPCWSTR)");
+ OBJ_CONTEXT("ShellPath::ShellPath(LPCWSTR)", path);
if (path) {
ULONG l;
- CheckError(Desktop()->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
+ CHECKERROR(Desktop()->ParseDisplayName(0, 0, (LPOLESTR)path, &l, &_p, 0));
} else
_p = NULL;
}
@@ -567,7 +567,7 @@ struct ShellPath : public SShellPtr
if (path) {
MultiByteToWideChar(CP_ACP, 0, path, -1, b, MAX_PATH);
- CheckError(folder->ParseDisplayName(0, 0, b, &l, &_p, 0));
+ CHECKERROR(folder->ParseDisplayName(0, 0, b, &l, &_p, 0));
} else
_p = NULL;
}
@@ -581,7 +581,7 @@ struct ShellPath : public SShellPtr
if (path) {
MultiByteToWideChar(CP_ACP, 0, path, -1, b, MAX_PATH);
- CheckError(Desktop()->ParseDisplayName(0, 0, b, &l, &_p, 0));
+ CHECKERROR(Desktop()->ParseDisplayName(0, 0, b, &l, &_p, 0));
} else
_p = NULL;
}
@@ -854,7 +854,7 @@ struct SpecialFolderPath : public ShellPath
SpecialFolderPath(int folder, HWND hwnd)
{
HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p);
- CheckError(hr);
+ CHECKERROR(hr);
}
};
@@ -913,7 +913,7 @@ struct SpecialFolderFSPath : public FileSysShellPath
CONTEXT("SpecialFolderFSPath::SpecialFolderFSPath()");
HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p);
- CheckError(hr);
+ CHECKERROR(hr);
}
};
@@ -928,6 +928,6 @@ struct ShellItemEnumerator : public SIfacePtr
{
CONTEXT("ShellItemEnumerator::ShellItemEnumerator()");
- CheckError(folder->EnumObjects(0, flags, &_p));
+ CHECKERROR(folder->EnumObjects(0, flags, &_p));
}
};
diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp
index a568ed1d0a7..235a0a4f729 100644
--- a/reactos/subsys/system/explorer/utility/utility.cpp
+++ b/reactos/subsys/system/explorer/utility/utility.cpp
@@ -93,15 +93,15 @@ void MoveVisible(HWND hwnd)
}
-void display_error(HWND hwnd, DWORD error)
+void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben
{
PTSTR msg;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL))
- MessageBox(hwnd, msg, TEXT("Winefile"), MB_OK);
+ MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK);
else
- MessageBox(hwnd, TEXT("Error"), TEXT("Winefile"), MB_OK);
+ MessageBox(hwnd, TEXT("Unknown Error"), TEXT("ROS Explorer"), MB_OK);
LocalFree(msg);
}
@@ -129,6 +129,8 @@ BOOL time_to_filetime(const time_t* t, FILETIME* ftime)
BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow)
{
+ CONTEXT("launch_file()");
+
HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow);
if ((int)hinst <= 32) {
diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h
index b503614a57b..dcf02011ed6 100644
--- a/reactos/subsys/system/explorer/utility/utility.h
+++ b/reactos/subsys/system/explorer/utility/utility.h
@@ -493,8 +493,18 @@ struct String
String(const super& other) : super(other) {}
String(const String& other) : super(other) {}
- String& operator=(LPCTSTR s) {assign(s); return *this;}
- String& operator=(const super& s) {assign(s); return *this;}
+#ifdef UNICODE
+ String(LPCSTR s) {assign(s);}
+ String& operator=(LPCSTR s) {assign(s); return *this;}
+ void assign(LPCSTR s) {TCHAR b[BUFFER_LEN]; MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN); super::assign(b);}
+#else
+ String(LPCWSTR s) {assign(s);}
+ String& operator=(LPCWSTR s) {assign(s); return *this;}
+ void assign(LPCWSTR s) {char b[BUFFER_LEN]; WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0); super::assign(b);}
+#endif
+
+ String& operator=(LPCTSTR s) {super::assign(s); return *this;}
+ String& operator=(const super& s) {super::assign(s); return *this;}
operator LPCTSTR() const {return c_str();}
};
@@ -555,6 +565,54 @@ protected:
FCT _fct;
};
+
+struct Context
+{
+ Context(LPCTSTR ctx)
+ : _ctx(ctx)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ Context(LPCTSTR ctx, LPCSTR obj)
+ : _ctx(ctx),
+ _obj(obj)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ Context(LPCTSTR ctx, LPCWSTR obj)
+ : _ctx(ctx),
+ _obj(obj)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ ~Context()
+ {
+ s_current = _last;
+ }
+
+ LPCTSTR _ctx;
+ String _obj;
+
+ static Context current() {return *s_current;}
+
+protected:
+ Context* _last;
+
+ static Context* s_current;
+ static Context s_main;
+};
+
+#define CONTEXT_OBJ __ctx__._obj
+#define CONTEXT(c) Context __ctx__(TEXT(c))
+#define OBJ_CONTEXT(c, o) Context __ctx__(TEXT(c), o);
+
+
#endif // __cplusplus