c++ - 为什么会出现 Error undefined _getws_s?

标签 c++ c++builder c++builder-xe2

我使用 C++ Builder XE2。

我的代码有警告和错误,但我不明白错误:

[BCC32 Error] File5.cpp(44): E2451 Undefined symbol' getws instead use StringCchGetsW or StringCbGetsW'

但是 _getws_sstdio.h 中,我包含了它,它有 _getws_s 原型(prototype):

wchar_t*  _RTLENTRY _EXPFUNC _getws_s(wchar_t * __s, rsize_t __n);

问题是什么?

#include <vcl.h>
#include <windows.h>

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>

#include <dshow.h>
#include <stdio.h>
#include <conio.h>

#define PATH_MAXLEN 256

const GUID CLSID_MPEGLayer3Decoder = {
    0x38BE3000, 0xDBF4, 0x11D0,
    {0x86, 0x0E, 0x00, 0xA0, 0x24, 0xCF, 0xEF, 0x6D}
};

void _tmain()
{
    char c = 0;
    WCHAR wszFileName[PATH_MAXLEN];
    HRESULT hr;
    IGraphBuilder * pFGM = NULL;
    IBaseFilter * pSrcFilter    = NULL;
    IBaseFilter * pSplitter     = NULL;
    IBaseFilter * pDecoder      = NULL;
    IBaseFilter * pRenderer     = NULL;;

    //--------------------------------------------------------------------------------
    // COM 라이브러리를 초기화한다.
    hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("COM 라이브러리를 초기화할 수 없습니다.\n");
        return;
    }

    //--------------------------------------------------------------------------------
    // 재생할 파일을 사용자가 입력할 것을 기다린다.
    printf("재생할 MP3 파일의 이름을 입력하십시오: ");
//--------------------------Error-----------------------
    _getws_s(wszFileName, PATH_MAXLEN);
//------------------------------------------------------

    //--------------------------------------------------------------------------------
    // 필터 그래프 매니저 컴포넌트를 생성하고, 인터페이스를 가져 온다.
    hr = CoCreateInstance(
        CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder, (LPVOID*)&pFGM);
    if (FAILED(hr))
    {
        printf("필터 그래프 매니저를 생성할 수 없습니다.\n");
        return;
    }

    printf("필터 그래프 매니저가 성공적으로 만들어지고, 필터 그래프에 추가되었습니다.\n");

    printf("MP3를 재생하기 위한 필터들을 필터 그래프에 추가합니다.\n");

    //--------------------------------------------------------------------------------
    // 소스 필터를 생성하고 이를 필터 그래프에 추가한다.
    hr = pFGM->AddSourceFilter(wszFileName, wszFileName, &pSrcFilter);
    if (FAILED(hr))
    {
        printf("소스 필터를 생성할 수 없습니다.\n");
        goto Terminate;
    }
    printf("소스 필터가 성공적으로 만들어졌습니다.\n");

    //--------------------------------------------------------------------------------
    // MPEG-1 스플리터 필터를 생서아고 이를 필터 그래프에 추가한다.
    hr = CoCreateInstance(
        CLSID_MPEG1Splitter, NULL, CLSCTX_INPROC_SERVER,
        IID_IBaseFilter, (LPVOID*)&pSplitter);
    if (FAILED(hr))
    {
        printf("MPEG-1 Splitter 필터를 생성할 수 없습니다.\n");
        goto Terminate;
    }
    printf("MPEG-1 Splitter 필터가 성공적으로 만들어졌습니다.\n");

    hr = pFGM->AddFilter(pSplitter, NULL);
    if (FAILED(hr))
    {
        printf("MPEG-1 Splitter 필터를 필터 그래프에 추가할 수 없습니다.\n");
        goto Terminate;
    }
    printf("MPEG-1 Splitter 필터가 필터 그래프에 추가되었습니다.\n");

    //--------------------------------------------------------------------------------
    // MPEG Layer-3 디코더 필터를 생성하고 이를 필터 그래프에 추가한다.
    hr = CoCreateInstance(
        CLSID_MPEGLayer3Decoder, NULL, CLSCTX_INPROC_SERVER,
        IID_IBaseFilter, (LPVOID*)&pDecoder);
    if (FAILED(hr))
    {
        printf("MPEG Layer-3 Decoder 필터를 생성할 수 없습니다.\n");
        goto Terminate;
    }
    printf("MPEG Layer-3 Decoder 필터가 성공적으로 만들어졌습니다.\n");

    hr = pFGM->AddFilter(pDecoder, NULL);
    if (FAILED(hr))
    {
        printf("MPEG Layer-3 Decoder 필터를 필터 그래프에 추가할 수 없습니다.\n");
        goto Terminate;
    }
    printf("MPEG Layer-3 Decoder 필터가 필터 그래프에 추가되었습니다.\n");

    //--------------------------------------------------------------------------------
    // 렌더러 필터를 생성하고 이를 필터 그래프에 추가한다.
    hr = CoCreateInstance(
        CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER,
        IID_IBaseFilter, (LPVOID*)&pRenderer);
    if (FAILED(hr))
    {
        printf("DirectSound Renderer 필터를 생성할 수 없습니다.\n");
        goto Terminate;
    }
    printf("DirectSound Renderer 필터가 성공적으로 만들어졌습니다.\n");

    hr = pFGM->AddFilter(pRenderer, NULL);
    if (FAILED(hr))
    {
        printf("DirectSound Renderer 필터를 필터 그래프에 추가할 수 없습니다.\n");
        goto Terminate;
    }
    printf("DirectSound Renderer 필터가 필터 그래프에 추가되었습니다.\n");

Terminate:
    //--------------------------------------------------------------------------------
    // 생성된 필터들을 필터 그래프에 추가한 후에는 참조 카운트가 1씩 증가하므로
    // 이를 원복하려면 각 필터의 Release 멤버함수를 호출해야 한다.
    // 그래야 필터 그래프가 제거될 때 그에 속하는 필터들도 같이 제거된다.

    if (pSrcFilter)
        pSrcFilter->Release();
    if (pSplitter)
        pSplitter->Release();
    if (pDecoder)
        pDecoder->Release();
    if (pRenderer)
        pRenderer->Release();

    if (pFGM)
        pFGM->Release();
    CoUninitialize();
}

最佳答案

报错的原因是因为_getws()已弃用,_getws_s()只是 _getws() 的包装器.

strsafe.h header (如果未定义 DShow.h,则包含在 NO_DSHOW_STRSAFE 中),_getws定义如下:

#ifndef STRSAFE_NO_DEPRECATE
// Deprecate all of the unsafe functions to generate compiletime errors. If you do not want
// this then you can #define STRSAFE_NO_DEPRECATE before including this file
#ifdef DEPRECATE_SUPPORTED
...
#pragma deprecated(_getws)
...
#else // DEPRECATE_SUPPORTED
...
#undef _getws
#define _getws      _getws_instead_use_StringCchGetsW_or_StringCbGetsW; // <-- HERE

#endif  // DEPRECATE_SUPPORTED
#endif  // !STRSAFE_NO_DEPRECATE

C++Builder 不支持 #pragma deprecated , 所以 _getws被定义为 _getws_instead_use_StringCchGetsW_or_StringCbGetsW相反,这就是您在错误消息中看到的内容。

为避免错误,您需要:

  • 不包括 strsafe.h首先,例如通过定义 NO_DSHOW_STRSAFE在你的项目选项中,或者至少在 #include <dshow.h> 之上声明。

  • 定义STRSAFE_NO_DEPRECATE在你的项目选项中,或者至少在 #include <dshow.h> 之上声明。

关于c++ - 为什么会出现 Error undefined _getws_s?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46887701/

相关文章:

C++ 方法指针调用产生 undefined symbol 错误?

c++builder - 在 borland c++ builder 中的表单之间传输数据

c++ - 在 C++ 构建器 XE2 中使用 Windows.Management 命名空间

c++ - 从 QT lineEdit 获取 unicode 并将其写入文件

c++ - 从 HDF5 文件读取 : 3D data into 1D vector in memory

c++builder - 如何在我的 IDE 中摆脱这个烦人的 W8123 警告

c++ - 为什么 ProcessMessages 会抛出 C++ 异常?

c++ - 更改 VCL 组件内容的正确方法

c++ - 如何在 C++ 的 OOP 中使用 >> 运算符

c++ - C++ Windows XP 中的 int 21 等价物