함수 오버 플로우를 막기위해 변형된 함수인데, 컴파일 할 때 많은 워닝이 뜨게 되면 실제 새로 생긴 워닝을 발견하기 쉽지 않으므로 강제로 워닝을 안뜨도록 수정한다.

보안상 좋지 않지만 현실과 타협...!

경고가 나타나지 않도록 하기 위해서는
프로젝트 속성-> C/C++ -> 전처리기 정의-> "_CRT_SECURE_NO_WARNINGS" 디파인 추가

나의 해결책

#ifndef POINTER_64
#define POINTER_64
#endif

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;




------------- 스크랩 1 -------------
POINTER_64가 정의되지 않아서 생기는 에러인 듯하다.
winnt.h에 다음 한 줄을 추가하면 해결된다.

#define POINTER_64 __ptr64 // 추가
typedef void *PVOID;
typedef void * POINTER_64 PVOID64; 

그 외 잡다한 변수선언 관련 컴파일에러들은 Microsoft가 지키지 않던 C++ scope 관련 표준들을 최근에 와서 지킴으로써 발생하는 것들이 많아보인다.
무조건 선언해주도록 하자. -_-

몇 번 씩 당했던 문제들이지만 그 솔루션을 외우고 있지는 않고... 다행인 것은 다시 구글에서 찾는 시간이 매번 조금씩 짧아져간다는 것이다. ㅜㅜ

결국 DirectShow 관련 일은 개발환경 세팅이 반이라는 결론에 다다른다 (뭐 다른 일들도 크게 다르지 않지만).



[2009.2.24 또 당해서 추가함]
VS2005에서 Microsoft DirectX 9.0 SDK (February 2005) 설치 후 BaseClasses 컴파일 시 ctlutil.h에서 C4430 default int 문제가 발생함 - 이것은 각개 격파해야 하는 문제이나, 지난 번의 "C4430 = winnt.h 수정" 학습효과 때문에 한참 헤매다 결국 약 30분 간 의식을 잃음. 다음과 같이 각개 격파하자!

(ctlutil.h)
COARefTime(LONG);
operator=(LONG); // C4430
(LONG)operator = (LONG);

(wxdebug.cpp)
//static g_dwLastRefresh = 0; C4430
static DWORD g_dwLastRefresh = 0;

(outputq.cpp)
//for (long iDone = 0; C2065
long iDone;
for(iDone = 0;

(winutil.cpp)
int Count; // C2065
for (Count = 0;Count < Result;Count++) { // C2065




------------- 스크랩 2 -------------
위 에러의 원인은...

DirectX 관련 라이브러리가 배포하는 basetsd.h 라는 파일 때문이다.

어떤 이유인지는 모르겠으나... DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에는 
POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문이다.

에러가 발생하는 과정은....
windows.h 에서 winnt.h 를 include 하고, winnt.h 가 PVOID64 를 정의하기 위해 

typedef void * POINTER_64 PVOID64;

위와같이 typedef 를 하는데 POINTER_64 키워드 정의를 찾기위해 basetsd.h 파일을 include 한다.
그런데, VisualStudio 등의 설치된 SDK의 include 에 있는 basetsd.h 에는 POINTER_64에 대한 정의가 있지만, '프로젝트 설정,C/C++, 일반' 의 '추가 포함 디렉터리' 란에 POINTER_64의 정의가 없는 basetsd.h 파일이 있는 디렉토리를 설정함으로 인해 위의 컴파일 에러가 발생하게 된다.

근본적인 해결책은,
POINTER_64 키워드에 대한 정의가 빠진 basetsd.h 파일을 include 하지 않도록 이 파일을 제거하거나, 만약 기어코 이 파일을 써야겠다면, 그 파일에 아래와 같은 정의를 포함해야 한다.

#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif

이것이 해결책.


------------- 스크랩 3 -------------

vs 2005에서 나오는 문제임.

 

문제 :

winnt.h 에서

typedef void * POINTER_64 PVOID64; 을 컴파일할때

          error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.

에러가 뜸.

 

원인 :

 POINTER_64 가 basestd.h 에서 정의되지 못하는 문제.

 

해결책 :

  주의. 64bit 환경일때는 테스트 못해 봄

 

  1. winnt.h 를 수정하는 방법

 

        #define POINTER_64    // 추가

        typedef void *PVOID;
        typedef void * POINTER_64 PVOID64;

 

  2. stdafx.h 에서 다른 파일을 include 하기 전에 define 을 추가

 

        #define POINTER_64    // 추가

        #include ...




 
 
 
system.lib(dxdiaginfo.obj) : error LNK2001: unresolved external symbol _CLSID_DxDiagProvider
system.lib(dxdiaginfo.obj) : error LNK2001: unresolved external symbol _IID_IDxDiagProvider

다음과 같은 링크 에러가 날때는 

Guiddef.h 파일에서 
#include <InitGuid.h> 를 삽입해준다.
1. bat 파일 만들기

FOR /R %1 %%1 IN (.svn) DO RMDIR /S /Q "%%1"
PAUSE

bat 파일 만들고 원하는 폴더 드래그해서 넣으면 됨 


2. 마우스 우 클릭하기

다음과 같은 .reg파일을 만들어 레지스트리에 등록하면 .svn폴더를 지워주는 메뉴가 우클릭 팝업에 추가됨.


Windows Registry Editor Version 5.00 


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]

@="Delete SVN Folders" 


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]

@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"

도구->옵션->프로젝트 및 솔루션->일반에 [솔류션 탐색기에서 활성화된 항목 추적] 이란 필드를 체크하면 동일한 기능이 수행됩니다.

간혹 컴파일 하다보면 이런 경고가 튀어 나올때가 있다. (주로 warning level이 높게 지정된 경우 - 4정도? - 에 튀어나온다)

 

warning C4100: 'argc' : unreferenced formal parameter
warning C4100: 'argc' : 참조되지 않은 형식 매개 변수입니다.

 

한마디로, 선언은 해놨지만 쓰이지 않고 있다는 소리다.

Console 프로그램의 argc, argv같은 경우나, 프로토타이핑할 때 함수나 클래스의 껍데기만 만들다 보면 주로 발생한다. 
사실 별로 상관은 없으니까 무시하면 된다...

그러나!! 계속 눈에 거슬리니까 신경 쓰인다. (당신도 변태? -_-+)

이럴땐 UNREFERENCED_PARAMETER(...) 매크로를 사용하자.

 

void SomeFunction(int arg1)
{
    UNREFERENCED_PARAMETER(arg1);
}
 

실제 구현은 다음과 같다. (winnt.h에 선언되어 있다. windows.h를 include하면 알아서 따라온다.)

 

#define UNREFERENCED_PARAMETER(P)          (P)

 

그냥, warning없애주기 위해 한번 쓱 건드리고 지나가는 역활밖에 안한다. -_-;
성능에 영향도 없는데다, 오류도 없애주니까.. 신경쓰일땐 애용해 보자.

(물론 #pragma warning( disable : 4100 )로 간단하게 없애는 방법도 있지만.. 진정한 변태라면!!)

 

이 외에도
DBG_UNREFERENCED_PARAMETER, DBG_UNREFERENCED_LOCAL_VARIABLE 등도 준비되어 있다.
입맛에 따라 골라써먹자! -_-!!

미리 정의된 환경 변수

%ALLUSERSPROFILE%C:\Documents and Settings\All Users
%APPDATA%C:\Documents and Settings\{username}\Application Data
%COMPUTERNAME%{computername}
%COMSPEC%C:\Windows\System32\cmd.exe
%HOMEDRIVE%C:
%HOMEPATH%\Documents and Settings\{username}
%PATH%C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem
%PATHEXT%.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH
%PROGRAMFILES%Directory containing program files, usually C:\Program Files
%PROMPT%Code for current command prompt format. Code is usually $P$G
%SYSTEMDRIVE%The drive containing the Windows XP root directory, usually C:
%SYSTEMROOT%The Windows XP root directory, usually C:\Windows
%TEMP% and %TMP%C:\DOCUME~1\{username}\LOCALS~1\Temp
%USERNAME%{username}
%USERPROFILE%C:\Documents and Settings\{username}
%WINDIR%C:\Windows

동적인 환경 변수

%DATE%Current date in the format determined by the Date command
%TIME%Current time in the format determined by the Time command
%CD%Current directory with its full path
%ERRORLEVEL%Number defining exit status of a previous command or program
%RANDOM%Random number between 0 and 32767
0xabababab        HeapAlloc으로 메모리 할당 후 가드 바이트에 채워진 값
0xbaadf00d         LocalAlloc(LMEM_FIXED)으로 메모리 할당된 후 초기화 되지 않은 값
0xcccccccc       초기화 되지 않은 스택 메모리
0xcdcdcdcd       메모리 할당 후 초기화 되지 않은 힙 메모리
0xdddddddd       해제된 힙 메모리
0xfdfdfdfd           할당된 메모리의 전후 가드용 바이트에 채워지는 값
0xfeeefeee         힙 메모리를 해제한 후 채워지는 값 [HeapFree()]
QueryPerformanceCounter 함수는 현재 cpu 틱을 받아 오는건데 i7 cpu에서 부스터 기능 때문에 제대로 동작하지 않을 가능성이 있다. 그렇다고 timeGetTime을 쓰자니 정밀하지 않고, 이래저래 생각 끝에 그래도 아직은 QueryPerformanceCounter를 써야 하지 않을까 싶다.

예제)
using namespace std;

double OutPutTime( const LARGE_INTEGER& freq, const LARGE_INTEGER& startTime, const LARGE_INTEGER& endTime )
{
return ((double)(endTime.QuadPart - startTime.QuadPart) / freq.QuadPart) * 1000;
}

int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER freq, startTime, endTime;

QueryPerformanceCounter(&startTime); //시작시간


QueryPerformanceCounter(&endTime); //종료시간
_tprintf( TEXT("/%lf ms\n"),  OutPutTime( freq, startTime, endTime ) ); //경과시간


getchar();

return 0;
}

wsprintf에서는 float형을 지원하지 않는데, 이럴 때 사용 할 수 있는 함수가 _stprintf_s이다.

+ Recent posts