From dd9e34b5e02ce75b94681ca1a92eba6c624b03f4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 1 Jun 2023 15:16:47 +0300 Subject: [PATCH] decklink: Implement Windows string conversion with common API between MinGW and MSVC Part-of: --- .../gst-plugins-bad/sys/decklink/gstdecklink.h | 28 +++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/decklink/gstdecklink.h b/subprojects/gst-plugins-bad/sys/decklink/gstdecklink.h index 0c73582..7c811e0 100644 --- a/subprojects/gst-plugins-bad/sys/decklink/gstdecklink.h +++ b/subprojects/gst-plugins-bad/sys/decklink/gstdecklink.h @@ -32,20 +32,26 @@ #include "win/DeckLinkAPI.h" #include -#include #define bool BOOL #define COMSTR_T BSTR -/* MinGW does not have comsuppw.lib, so no _com_util::ConvertBSTRToString */ -# ifdef __MINGW32__ -# define CONVERT_COM_STRING(s) G_STMT_START { BSTR _s = (BSTR)s; s = (char*) malloc(100); wcstombs(s, _s, 100); ::SysFreeString(_s); } G_STMT_END -# define FREE_COM_STRING(s) free(s); -# define CONVERT_TO_COM_STRING(s) G_STMT_START { char * _s = (char *)s; s = (BSTR) malloc(100); mbstowcs(s, _s, 100); g_free(_s); } G_STMT_END -# else -# define CONVERT_COM_STRING(s) G_STMT_START { BSTR _s = (BSTR)s; s = _com_util::ConvertBSTRToString(_s); ::SysFreeString(_s); } G_STMT_END -# define FREE_COM_STRING(s) G_STMT_START { delete[] s; } G_STMT_END -# define CONVERT_TO_COM_STRING(s) G_STMT_START { char * _s = (char *)s; s = _com_util::ConvertStringToBSTR(_s); g_free(_s); } G_STMT_END -# endif /* __MINGW32__ */ +#define CONVERT_COM_STRING(s) G_STMT_START { \ + BSTR _s = (BSTR)s; \ + int _s_length = ::SysStringLen(_s); \ + int _length = ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, _s_length, NULL, 0, NULL, NULL); \ + s = (char *) malloc(_length); \ + ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, _s_length, s, _length, NULL, NULL); \ + ::SysFreeString(_s); \ +} G_STMT_END +#define FREE_COM_STRING(s) free(s); +#define CONVERT_TO_COM_STRING(s) G_STMT_START { \ + char * _s = (char *)s; \ + int _s_length = strlen((char*)_s); \ + int _length = ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, _s_length, NULL, 0); \ + s = ::SysAllocStringLen(NULL, _length); \ + ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, _s_length, s, _length); \ + g_free(_s); \ +} G_STMT_END #elif defined(__APPLE__) #include "osx/DeckLinkAPI.h" -- 2.7.4