为什么会出现 Error undefined _getws_s?
why there Error undefined _getws_s?
我使用 C++ Builder XE2。
我的代码有警告和错误,但我不明白错误:
[BCC32 Error] File5.cpp(44): E2451 Undefined symbol' getws instead use StringCchGetsW or StringCbGetsW'
但是 _getws_s
在 stdio.h
中,我包括了它,它有 _getws_s
原型:
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_s
使用标准函数 fgets
可以从任何流中读取。像这样使用它,我指定它从 stdin
流中读取。
fgets(wszFileName, PATH_MAXLEN, stdin);
错误的原因是因为 _getws()
已被弃用,而 _getws_s()
只是 _getws()
.
的包装器
在strsafe.h
头文件中(如果NO_DSHOW_STRSAFE
未定义则包含在DShow.h
中),_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++ Builder XE2。
我的代码有警告和错误,但我不明白错误:
[BCC32 Error] File5.cpp(44): E2451 Undefined symbol' getws instead use StringCchGetsW or StringCbGetsW'
但是 _getws_s
在 stdio.h
中,我包括了它,它有 _getws_s
原型:
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_s
使用标准函数 fgets
可以从任何流中读取。像这样使用它,我指定它从 stdin
流中读取。
fgets(wszFileName, PATH_MAXLEN, stdin);
错误的原因是因为 _getws()
已被弃用,而 _getws_s()
只是 _getws()
.
在strsafe.h
头文件中(如果NO_DSHOW_STRSAFE
未定义则包含在DShow.h
中),_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>
语句之上。