scrrun: Implement GetFileVersion()

Nikolay Sivov nsivov at codeweavers.com
Wed Dec 19 01:26:32 CST 2012


Implement GetFileVersion()
-------------- next part --------------
>From 15a28511e7fb20712b50a3c25ee6a16491668998 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 19 Dec 2012 11:17:56 +0400
Subject: [PATCH 5/7] Implement GetFileVersion()

---
 dlls/scrrun/Makefile.in        |    2 +-
 dlls/scrrun/filesystem.c       |   50 ++++++++++++++++++++++++++++++++++++----
 dlls/scrrun/tests/filesystem.c |   38 ++++++++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 5 deletions(-)

diff --git a/dlls/scrrun/Makefile.in b/dlls/scrrun/Makefile.in
index d8d71b2..4ceac05 100644
--- a/dlls/scrrun/Makefile.in
+++ b/dlls/scrrun/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = scrrun.dll
-IMPORTS   = uuid oleaut32
+IMPORTS   = uuid oleaut32 version
 
 C_SRCS = \
 	dictionary.c \
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 8fafc7c..4f0b163 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -30,6 +30,7 @@
 #include "scrrun_private.h"
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
 
@@ -933,12 +934,53 @@ static HRESULT WINAPI filesys_GetStandardStream(IFileSystem3 *iface,
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI filesys_GetFileVersion(IFileSystem3 *iface, BSTR FileName,
-                                            BSTR *FileVersion)
+static void get_versionstring(VS_FIXEDFILEINFO *info, WCHAR *ver)
 {
-    FIXME("%p %s %p\n", iface, debugstr_w(FileName), FileVersion);
+    static WCHAR fmtW[] = {'%','d','.','%','d','.','%','d','.','%','d',0};
+    DWORDLONG version;
+    WORD a, b, c, d;
 
-    return E_NOTIMPL;
+    version = (((DWORDLONG)info->dwFileVersionMS) << 32) + info->dwFileVersionLS;
+    a = (WORD)( version >> 48);
+    b = (WORD)((version >> 32) & 0xffff);
+    c = (WORD)((version >> 16) & 0xffff);
+    d = (WORD)( version & 0xffff);
+
+    sprintfW(ver, fmtW, a, b, c, d);
+}
+
+static HRESULT WINAPI filesys_GetFileVersion(IFileSystem3 *iface, BSTR name, BSTR *version)
+{
+    static const WCHAR rootW[] = {'\\',0};
+    VS_FIXEDFILEINFO *info;
+    WCHAR ver[30];
+    void *ptr;
+    DWORD len;
+    BOOL ret;
+
+    TRACE("%p %s %p\n", iface, debugstr_w(name), version);
+
+    len = GetFileVersionInfoSizeW(name, NULL);
+    if (!len)
+        return HRESULT_FROM_WIN32(GetLastError());
+
+    ptr = heap_alloc(len);
+    if (!GetFileVersionInfoW(name, 0, len, ptr))
+    {
+        heap_free(ptr);
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    ret = VerQueryValueW(ptr, rootW, (void**)&info, &len);
+    heap_free(ptr);
+    if (!ret)
+        return HRESULT_FROM_WIN32(GetLastError());
+
+    get_versionstring(info, ver);
+    *version = SysAllocString(ver);
+    TRACE("version=%s\n", debugstr_w(ver));
+
+    return S_OK;
 }
 
 static const struct IFileSystem3Vtbl filesys_vtbl =
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index e0c8684..b93927c 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -217,6 +217,43 @@ todo_wine {
     DeleteFileW(testfileW);
 }
 
+static void test_GetFileVersion(void)
+{
+    static const WCHAR k32W[] = {'\\','k','e','r','n','e','l','3','2','.','d','l','l',0};
+    static const WCHAR k33W[] = {'\\','k','e','r','n','e','l','3','3','.','d','l','l',0};
+    WCHAR pathW[MAX_PATH], filenameW[MAX_PATH];
+    BSTR path, version;
+    HRESULT hr;
+
+    GetSystemDirectoryW(pathW, sizeof(pathW)/sizeof(WCHAR));
+
+    lstrcpyW(filenameW, pathW);
+    lstrcatW(filenameW, k32W);
+
+    path = SysAllocString(filenameW);
+    hr = IFileSystem3_GetFileVersion(fs3, path, &version);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(*version != 0, "got %s\n", wine_dbgstr_w(version));
+    SysFreeString(version);
+    SysFreeString(path);
+
+    lstrcpyW(filenameW, pathW);
+    lstrcatW(filenameW, k33W);
+
+    path = SysAllocString(filenameW);
+    version = (void*)0xdeadbeef;
+    hr = IFileSystem3_GetFileVersion(fs3, path, &version);
+    ok(broken(hr == S_OK) || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
+    if (hr == S_OK)
+    {
+        ok(*version == 0, "got %s\n", wine_dbgstr_w(version));
+        SysFreeString(version);
+    }
+    else
+        ok(version == (void*)0xdeadbeef, "got %p\n", version);
+    SysFreeString(path);
+}
+
 START_TEST(filesystem)
 {
     HRESULT hr;
@@ -233,6 +270,7 @@ START_TEST(filesystem)
     test_interfaces();
     test_createfolder();
     test_textstream();
+    test_GetFileVersion();
 
     IFileSystem3_Release(fs3);
 
-- 
1.7.10.4




More information about the wine-patches mailing list