From: Nguyen Dinh Phi <phind.uet@gmail.com>
Newer versions of MinGW-w64 provide ConvertStringToBSTR() in the
_com_util namespace via <comutil.h>. This causes a redefinition
error when building qemu-ga on Windows with these toolchains.
Add a meson check to detect whether ConvertStringToBSTR is already
available, and conditionally compile our fallback implementation
only when the system does not provide one.
Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
---
meson.build | 12 ++++++++++++
qga/vss-win32/install.cpp | 2 ++
2 files changed, 14 insertions(+)
diff --git a/meson.build b/meson.build
index c5710a6a47..60a980e610 100644
--- a/meson.build
+++ b/meson.build
@@ -3299,6 +3299,18 @@ endif
# Detect host pointer size for the target configuration loop.
host_long_bits = cc.sizeof('void *') * 8
+# Detect if ConvertStringToBSTR has been defined in _com_util namespace
+if host_os == 'windows'
+ has_convert_string_to_bstr = cxx.compiles('''
+ #include <comutil.h>
+ int main() {
+ BSTR b = _com_util::ConvertStringToBSTR("test");
+ return b ? 0 : 1;
+ }
+ ''')
+ config_host_data.set('CONFIG_CONVERT_STRING_TO_BSTR', has_convert_string_to_bstr)
+endif
+
########################
# Target configuration #
########################
diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp
index 7b25d9098b..5b7a8e9bc5 100644
--- a/qga/vss-win32/install.cpp
+++ b/qga/vss-win32/install.cpp
@@ -549,6 +549,7 @@ STDAPI DllUnregisterServer(void)
/* Support function to convert ASCII string into BSTR (used in _bstr_t) */
+#ifndef CONFIG_CONVERT_STRING_TO_BSTR
namespace _com_util
{
BSTR WINAPI ConvertStringToBSTR(const char *ascii) {
@@ -566,6 +567,7 @@ namespace _com_util
return bstr;
}
}
+#endif
/* Stop QGA VSS provider service using Winsvc API */
STDAPI StopService(void)
--
2.43.0
Hi
On Mon, Dec 15, 2025 at 8:57 PM <phind.uet@gmail.com> wrote:
> From: Nguyen Dinh Phi <phind.uet@gmail.com>
>
> Newer versions of MinGW-w64 provide ConvertStringToBSTR() in the
> _com_util namespace via <comutil.h>. This causes a redefinition
> error when building qemu-ga on Windows with these toolchains.
>
> Add a meson check to detect whether ConvertStringToBSTR is already
> available, and conditionally compile our fallback implementation
> only when the system does not provide one.
>
> Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
> ---
> meson.build | 12 ++++++++++++
> qga/vss-win32/install.cpp | 2 ++
> 2 files changed, 14 insertions(+)
>
> diff --git a/meson.build b/meson.build
> index c5710a6a47..60a980e610 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -3299,6 +3299,18 @@ endif
> # Detect host pointer size for the target configuration loop.
> host_long_bits = cc.sizeof('void *') * 8
>
> +# Detect if ConvertStringToBSTR has been defined in _com_util namespace
> +if host_os == 'windows'
> + has_convert_string_to_bstr = cxx.compiles('''
> + #include <comutil.h>
> + int main() {
> + BSTR b = _com_util::ConvertStringToBSTR("test");
> + return b ? 0 : 1;
> + }
> + ''')
> + config_host_data.set('CONFIG_CONVERT_STRING_TO_BSTR',
> has_convert_string_to_bstr)
> +endif
> +
> ########################
> # Target configuration #
> ########################
> diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp
> index 7b25d9098b..5b7a8e9bc5 100644
> --- a/qga/vss-win32/install.cpp
> +++ b/qga/vss-win32/install.cpp
> @@ -549,6 +549,7 @@ STDAPI DllUnregisterServer(void)
>
>
> /* Support function to convert ASCII string into BSTR (used in _bstr_t) */
> +#ifndef CONFIG_CONVERT_STRING_TO_BSTR
>
I wonder if it could check __MINGW64_VERSION_MAJOR >= 14 instead of adding
a configure-time check.
lgtm anyway
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
namespace _com_util
> {
> BSTR WINAPI ConvertStringToBSTR(const char *ascii) {
> @@ -566,6 +567,7 @@ namespace _com_util
> return bstr;
> }
> }
> +#endif
>
> /* Stop QGA VSS provider service using Winsvc API */
> STDAPI StopService(void)
> --
> 2.43.0
>
>
Hi
On Tue, Dec 16, 2025 at 8:26 AM Marc-André Lureau <
marcandre.lureau@redhat.com> wrote:
> Hi
>
> On Mon, Dec 15, 2025 at 8:57 PM <phind.uet@gmail.com> wrote:
>
>> From: Nguyen Dinh Phi <phind.uet@gmail.com>
>>
>> Newer versions of MinGW-w64 provide ConvertStringToBSTR() in the
>> _com_util namespace via <comutil.h>. This causes a redefinition
>> error when building qemu-ga on Windows with these toolchains.
>>
>> Add a meson check to detect whether ConvertStringToBSTR is already
>> available, and conditionally compile our fallback implementation
>> only when the system does not provide one.
>>
>> Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
>> ---
>> meson.build | 12 ++++++++++++
>> qga/vss-win32/install.cpp | 2 ++
>> 2 files changed, 14 insertions(+)
>>
>> diff --git a/meson.build b/meson.build
>> index c5710a6a47..60a980e610 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -3299,6 +3299,18 @@ endif
>> # Detect host pointer size for the target configuration loop.
>> host_long_bits = cc.sizeof('void *') * 8
>>
>> +# Detect if ConvertStringToBSTR has been defined in _com_util namespace
>> +if host_os == 'windows'
>> + has_convert_string_to_bstr = cxx.compiles('''
>> + #include <comutil.h>
>> + int main() {
>> + BSTR b = _com_util::ConvertStringToBSTR("test");
>> + return b ? 0 : 1;
>> + }
>> + ''')
>> + config_host_data.set('CONFIG_CONVERT_STRING_TO_BSTR',
>> has_convert_string_to_bstr)
>> +endif
>> +
>> ########################
>> # Target configuration #
>> ########################
>> diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp
>> index 7b25d9098b..5b7a8e9bc5 100644
>> --- a/qga/vss-win32/install.cpp
>> +++ b/qga/vss-win32/install.cpp
>> @@ -549,6 +549,7 @@ STDAPI DllUnregisterServer(void)
>>
>>
>> /* Support function to convert ASCII string into BSTR (used in _bstr_t)
>> */
>> +#ifndef CONFIG_CONVERT_STRING_TO_BSTR
>>
>
> I wonder if it could check __MINGW64_VERSION_MAJOR >= 14 instead of adding
> a configure-time check.
>
@Peter Maydell <peter.maydell@linaro.org> preferred to avoid specific
version-number checks.
See: https://gitlab.com/qemu-project/qemu/-/issues/3217#note_2935451782
I also preferred the idea of checking the real function present instead of
the version of the component.
Reviewed-by: Kostiantyn Kostiuk <kkostiuk@redhat.com>
>
> lgtm anyway
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> namespace _com_util
>> {
>> BSTR WINAPI ConvertStringToBSTR(const char *ascii) {
>> @@ -566,6 +567,7 @@ namespace _com_util
>> return bstr;
>> }
>> }
>> +#endif
>>
>> /* Stop QGA VSS provider service using Winsvc API */
>> STDAPI StopService(void)
>> --
>> 2.43.0
>>
>>
© 2016 - 2025 Red Hat, Inc.