ole32: Use ILockBytes_Stat to get the filename of a storage.
diff --git a/dlls/ole32/filelockbytes.c b/dlls/ole32/filelockbytes.c
index 2491a82..29bd1b1 100644
--- a/dlls/ole32/filelockbytes.c
+++ b/dlls/ole32/filelockbytes.c
@@ -41,6 +41,7 @@
#include "storage32.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(storage);
@@ -51,6 +52,7 @@
ULARGE_INTEGER filesize;
HANDLE hfile;
DWORD flProtect;
+ LPWSTR pwcsName;
} FileLockBytesImpl;
static const ILockBytesVtbl FileLockBytesImpl_Vtbl;
@@ -85,9 +87,10 @@
*
* Initialize a big block object supported by a file.
*/
-HRESULT FileLockBytesImpl_Construct(HANDLE hFile, DWORD openFlags, ILockBytes **pLockBytes)
+HRESULT FileLockBytesImpl_Construct(HANDLE hFile, DWORD openFlags, LPCWSTR pwcsName, ILockBytes **pLockBytes)
{
FileLockBytesImpl *This;
+ WCHAR fullpath[MAX_PATH];
if (hFile == INVALID_HANDLE_VALUE)
return E_FAIL;
@@ -104,6 +107,23 @@
&This->filesize.u.HighPart);
This->flProtect = GetProtectMode(openFlags);
+ if(pwcsName) {
+ if (!GetFullPathNameW(pwcsName, MAX_PATH, fullpath, NULL))
+ {
+ lstrcpynW(fullpath, pwcsName, MAX_PATH);
+ }
+ This->pwcsName = HeapAlloc(GetProcessHeap(), 0,
+ (lstrlenW(fullpath)+1)*sizeof(WCHAR));
+ if (!This->pwcsName)
+ {
+ HeapFree(GetProcessHeap(), 0, This);
+ return E_OUTOFMEMORY;
+ }
+ strcpyW(This->pwcsName, fullpath);
+ }
+ else
+ This->pwcsName = NULL;
+
TRACE("file len %u\n", This->filesize.u.LowPart);
*pLockBytes = (ILockBytes*)This;
@@ -145,6 +165,7 @@
if (ref == 0)
{
CloseHandle(This->hfile);
+ HeapFree(GetProcessHeap(), 0, This->pwcsName);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -324,12 +345,16 @@
{
FileLockBytesImpl* This = (FileLockBytesImpl*)iface;
- if (!(STATFLAG_NONAME & grfStatFlag))
+ if (!(STATFLAG_NONAME & grfStatFlag) && This->pwcsName)
{
- FIXME("reading filename not supported\n");
- }
+ pstatstg->pwcsName =
+ CoTaskMemAlloc((lstrlenW(This->pwcsName)+1)*sizeof(WCHAR));
- pstatstg->pwcsName = NULL;
+ strcpyW(pstatstg->pwcsName, This->pwcsName);
+ }
+ else
+ pstatstg->pwcsName = NULL;
+
pstatstg->type = STGTY_LOCKBYTES;
pstatstg->cbSize = This->filesize;
/* FIXME: If the implementation is exported, we'll need to set other fields. */