[PATCH v2] odbccp32: Implement SQLConfigDataSource/W (resend)
Alexandre Julliard
julliard at winehq.org
Mon Nov 26 06:04:13 CST 2018
Alistair Leslie-Hughes <leslie_alistair at hotmail.com> writes:
> +static inline WCHAR *heap_attrdupAtoW(const char *str)
> +{
> + WCHAR *ret = NULL;
> +
> + if (str)
> + {
> + DWORD size = 0, len;
> + const char *p;
> + WCHAR *current;
> +
> + for (p = str; *p; p += lstrlenA(p) + 1)
> + {
> + len = MultiByteToWideChar(CP_ACP, 0, p, -1, NULL, 0);
> + size += len;
> + }
> +
> + current = ret = heap_alloc_zero( (size+1)*sizeof(WCHAR));
> + for (p = str; *p; p += lstrlenA(p) + 1)
> + {
> + len = MultiByteToWideChar(CP_ACP, 0, p, -1, current, size);
> + current += len;
> + }
There's no reason to convert strings one at a time, you can convert the
entire data in one call.
> +static BOOL call_ConfigDSN(HANDLE mod, HWND hwnd, WORD request, const char *driverA, const char *attributesA, const WCHAR *driverW, const WCHAR *attributesW)
> +{
> + BOOL (WINAPI *pConfigDSN)(HWND hwnd, WORD request, const char *driver, const char *attr);
> + BOOL (WINAPI *pConfigDSNW)(HWND hwnd, WORD request, const WCHAR *driver, const WCHAR *attr);
> + BOOL ret = FALSE;
> +
> + TRACE("%p, %p, %d, %p, %p, %p %p\n", mod, hwnd, request, driverA, attributesA, driverW, attributesW);
> +
> + pConfigDSN = (void*)GetProcAddress(mod, "ConfigDSN");
> + pConfigDSNW = (void*)GetProcAddress(mod, "ConfigDSNW");
> +
> + if (pConfigDSNW)
> + {
> + const WCHAR *attr = attributesW;
> + if(!attr)
> + attr = heap_attrdupAtoW(attributesA);
> +
> + TRACE("Calling ConfigDSNW (%p)\n", pConfigDSNW);
> +
> + ret = pConfigDSNW(hwnd, request, driverW, attr);
> +
> + if(attr != attributesW)
> + heap_free((WCHAR *)attr);
> + }
> + else if (pConfigDSN)
> + {
> + TRACE("Calling pConfigDSN (%p)\n", pConfigDSN);
> + ret = pConfigDSN(hwnd, request, driverA, attributesA);
> + }
> + else
> + ERR("Neither ConfigDSN or ConfigDSNW found.\n");
> +
> + if (!ret)
> + push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed);
> +
> + return ret;
> +}
This helper function is ugly, I expect the code would look better
without it, doing things directly in the corresponding entry points.
--
Alexandre Julliard
julliard at winehq.org
More information about the wine-devel
mailing list