5

我正在尝试编译一些 COM 代码,这里的示例。我得到了很好的编译,但链接了关于 ConvertStringtoBSTR 丢失的投诉。经过一番研究,我发现所说的符号应该在 comsupp.lib 中。问题是我在 Windows SDK 中找不到这个库......库或函数在哪里?

4

2 回答 2

6

只需从@HansPassant 复制评论,以便使评论成为答案。不是想偷他的答案,只是想让人们知道这个问题有答案。

It is not an SDK file, it is a Visual Studio file. Stored in the vc/lib directory. VS license required. – Hans Passant Feb 25 '12 at 19:09

于 2014-08-26T03:49:28.017 回答
1

七年后在谷歌搜索的情况下......如果你没有VS,你可以复制并使用这个函数的WineHQ源代码,就像这样:

char* WINAPI ConvertBSTRToString(BSTR pSrc)
{
    DWORD cb, cwch;
    char *szOut = NULL;

    if (!pSrc) return NULL;

    /* Retrieve the size of the BSTR with the NULL terminator */
    cwch = ::SysStringLen(pSrc) + 1;

    /* Compute the needed size with the NULL terminator */
    cb = ::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, NULL, 0, NULL, NULL);
    if (cb == 0)
    {
        cwch = ::GetLastError();
        ::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);
        return NULL;
    }

    /* Allocate the string */
    szOut = (char*)::operator new(cb * sizeof(char));
    if (!szOut)
    {
        ::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));
        return NULL;
    }

    /* Convert the string and NULL-terminate */
    szOut[cb - 1] = '\0';
    if (::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, szOut, cb, NULL, NULL) == 0)
    {
        /* We failed, clean everything up */
        cwch = ::GetLastError();

        ::operator delete(szOut);
        szOut = NULL;

        ::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);
    }

    return szOut;
}
于 2021-07-27T15:14:16.640 回答