C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74671] [질문] E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB' 다시 정리..
단단한돌 [heaven2] 3399 읽음    2017-11-22 21:19
DataSenderHeaderConflict.zip 27.5KB Header Conflict 되는 소스 코드 모음..
환경: C++ Builder XE5

사용 Component:
  - UI Component   : Button, Panel, TImage, TListView,.... 화면 UI Component들..
  - Indy Compnent  : IndyFTP, IndyTCPServer, IndyTCPClient
  - SFTP Component : SecureBlackBox SFTP Component (상용)

기존의 프로젝트에 SFTP(SecureFTP) 기능이 필요하여 SecureBlackBox라는 Component를 추가하였습니다.
추가한 Compnent가 기존 프로텍트의 Library와 여기저기 충돌을 일으켜서 다량의 Compile Error를 만들어 냅니다.
Build Order와 Include 순서를 조정해서 Compile Error를 잡았는데, 이것 하나만은 끈질기게 해결이 되지 않고 있습니다.

에러 메세지를 보면 CERT_NAME_BLOB 라는 이름이 SecureBlackBox Component(SbwinCrypt.hpp)에서 정의되고,
Windows SDK의 Header 파일인 <iphjlpapi.h>에서도 정의되어 사용되고 있습니다.
<iphlpapi.h> 파일은 시스템의 라우팅 정보를 가져오는 함수들이 정의되어 있습니다.
이 두개의 Header 모두 프로그램 운영에는 필요한 상태입니다.

에러를 보면 GardnetThread.cpp의 컴파일 과정에서 <iphlpapi.h>을 include 하기 전에,
"UnitMain.h"를 Include하게 되는데, 그 안에서 "SBSimpleSftp.hpp"를 include 하게 되고,
"SBSimpleSftp.hpp"의 include를 따라 가서 "Sbwincrypt.hpp"까지 include하게 되는데,
"Sbwincrypt.hpp"의 내용이 <iphlpapi.h>에서 include하는 <mprapi.h>의 선언부와 충돌됩니다.

'CERT_NAME_BLOB','CRYPT_HASH_BLOB' 이 두 개의 이름이 중복된다는 결론입니다.

이 두개의 include 순서를 뒤바꾸면, 더 엄청난 Compile error가 튀어 나옵니다.

충돌을 회피할 수 있는 방법은 어떤 것이 있을까요?

2주째 이 문제로 씨름 중입니다. Help~~~~!!

[부언 설명]
GardnetThread.cpp -----------> UnitMain.h ------------->SBSimpleSftp.hpp
(iphlpapi.h include)                                    (Sbwincrypt.hpp include)

- <iphlpapi.h> --> include --> <mprapi.h>
- <SBSimpleSftp.hpp> --> include --> <Sbwincrypt.hpp> 두 개의 파일에서 충돌..

//------------------------------------------------------------------------
// compile error 내용 
[bcc32 Error] mprapi.h(1273): E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB'
  Full parser context
    GuardnetThread.cpp(13): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iphlpapi.h   // 이  Header 파일이 문제를 발생
    iphlpapi.h(34): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iprtrmib.h
    iprtrmib.h(38): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\mprapi.h
    mprapi.h(1266): class _IKEV2_TUNNEL_CONFIG_PARAMS
[bcc32 Error] mprapi.h(1309): E2015 Ambiguity between 'CRYPT_HASH_BLOB' and 'Sbwincrypt::CRYPT_HASH_BLOB'
  Full parser context
    GuardnetThread.cpp(13): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iphlpapi.h
    iphlpapi.h(34): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iprtrmib.h
    iprtrmib.h(38): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\mprapi.h
    mprapi.h(1306): class _SSTP_CERT_INFO

//------------------------------------------------------------------------
// 파일의 내용
$Embacadero_HOME\rad studio\12.0\include\windows\sdk\mprapi.h
..
typedef struct _IKEV2_TUNNEL_CONFIG_PARAMS {
    DWORD                       dwIdleTimeout;
    DWORD                       dwNetworkBlackoutTime;
    DWORD                       dwSaLifeTime;
    DWORD                       dwSaDataSizeForRenegotiation;
    DWORD                       dwConfigOptions;
    DWORD 	                dwTotalCertificates;
    CERT_NAME_BLOB *            certificateNames;           // conflict 발생, 정의는 그전에 있음. 
}IKEV2_TUNNEL_CONFIG_PARAMS, *PIKEV2_TUNNEL_CONFIG_PARAMS;


//------------------------------------------------------------------------
//  파일의 내용 
$SecureBlackBox_HOME\Units\CBuilderXE5\SbwinCrypt.hpp

...
typedef CRYPTOAPI_BLOB CERT_NAME_BLOB;     // Conflict 발생 
typedef CRYPTOAPI_BLOB *PCERT_NAME_BLOB;
...

//=======================================================================
//  include 관계
#include 
#pragma hdrstop

#include "GuardnetThread.h"
#include "UnitMain.h"        // UnitMain.h에서  SecureBlackBox SFTP Component include함. 
#include "LockeCommon.h"
#include "Env.h"
#include "Thrdqueue.h"

#include         // conflict 발생.. 
#pragma comment(lib, "iphlpapi.lib")
#pragma package(smart_init)

TGuardnetThread *thrdGuardnet;
...

//=======================================================================
// UnitMain.h 파일의 include 관계
#ifndef UnitMainH
#define UnitMainH

#include 
#include 
#include 
#include 
...// VCL Library Header 

#include "SBSimpleSftp.hpp"     // SecureBlackBox SFTP Component include
                                // Indy Component 뒤에서 Include 하면 또다른 compile error 
#include 
#include 
#include 
#include 
...//Indy Library Header
#include 
...// DBExpress Header 

#include "AdPort.hpp"
#include "OoMisc.hpp"
...// other header include


namespace를 지정하여 해결하는 방법이 있을까요?


+ -

관련 글 리스트
74671 [질문] E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB' 다시 정리.. 단단한돌 3399 2017/11/22
74672     Re:[질문] E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB' 다시 정리.. 3612 2017/11/23
74673         SBSimpleSftp.hpp, Sbwincrypt.hpp 파일도 올려 놓았습니다. 제발 해결이 되기를...~~!! 단단한돌 3366 2017/11/23
74676             Re:SBSimpleSftp.hpp, Sbwincrypt.hpp 파일도 올려 놓았습니다. 제발 해결이 되기를...~~!! 3391 2017/11/24
74677                 다시 올려 놓았습니다. 감사합니다.~! 단단한돌 3644 2017/11/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.