

ctypesでWindowsAPIを利用して、exeファイルからバージョン情報の製品名を取得しようとしています。  
しかし、取得結果に不要な文字列がついてしまうことがあります。  
何かよい対処法はないでしょうか。

## ソースコード

[code]

    import array, ctypes, os
    
    def getFileVersionInfo(name):
        if not os.path.exists(name):
            raise RuntimeError("The file %s does not exist" % name)
        size = ctypes.windll.version.GetFileVersionInfoSizeW(name, None)
        if not size:
            raise RuntimeError("No version information")
        res = ctypes.create_string_buffer(size)
        ctypes.windll.version.GetFileVersionInfoW(name, None, size, res)
        r = ctypes.c_uint()
        l = ctypes.c_uint()
        ctypes.windll.version.VerQueryValueW(res, u'\\VarFileInfo\\Translation',
            ctypes.byref(r), ctypes.byref(l))
        if not l.value:
            raise RuntimeError("No codepage")
        codepage = array.array('H', ctypes.string_at(r.value, 4))
        codepage = "%04x%04x" % tuple(codepage)
        if not ctypes.windll.version.VerQueryValueW(res, u'\\StringFileInfo\\%s\\%s' % (codepage, "ProductName"), ctypes.byref(r), ctypes.byref(l)):
            raise RuntimeError("Invalid or unavailable version info")
        else:
            return ctypes.wstring_at(r.value, l.value)
    
    name="C:\\programs\\test.exe"
    verInfo = getFileVersionInfo(name)
    print(repr(verInfo))
    
[/code]

## 出力結果

実際に設定されている製品名は、「TestApp」ですが、「TestApp」の後ろに不要な文字列がついてしまっています。  
これを「TestApp」だけにするにはどうしたらよいでしょうか。

[code]

    'TestApp\x004\x0e\x01Pro'
    
[/code]

環境は、Windows10 64ビット、Python 3.7です。

以上、よろしくお願いします。


CC BY-SA 4.0
2020-01-18T04:57:02.850
62340
2020-01-20T01:47:07.213
2020-01-20T01:47:07.213
3060
29034
question
python python3 windows
Pythonでexeファイルからバージョン情報の取得時に不要な文字列が含まれてしまう


[`VerQueryValueW`](https://docs.microsoft.com/en-
us/windows/win32/api/winver/nf-winver-
verqueryvaluew)は状況によって文字数を返したりバイト数を返したりします。今回の場合、Unicode文字列のバイト数を返しているため、文字数としては値を半分にする必要があります。

実際、`TestApp\x004\x0e\x01Pro` は7文字14バイトのところを14文字取り出してしまっています。


CC BY-SA 4.0
2020-01-18T05:19:27.800
62341
2020-01-18T05:19:27.800
4236
62340
answer