문제

두 개의 타사 라이브러리를 사용하는 프로젝트가 있으며, 둘 다 헤더 파일에 TCHARS를 사용합니다. 불행히도 한 라이브러리는 다중 바이트 (Library A 호출)로 준수하고 다른 라이브러리는 유니 코드로 컴파일됩니다 (Library B 호출).

이제 내가 이해하는 방법은 TCHA가 빌드 옵션에 따라 WCHAR 또는 Char로 프리 컴파일러로 대체된다는 것입니다. 따라서 라이브러리 A가 컴파일되면 유형의 매개 변수를 취하는 모든 메소드가 유형 Char의 매개 변수를 기대하도록 설정되었으며 라이브러리 B의 메소드는 유형 WCHAR의 매개 변수를 예상하도록 설정됩니다.

불행히도 내 소비 애플리케이션은 캐릭터 세트도 선택해야합니다. 유니 코드를 선택하면 라이브러리 A에 포함 된 헤더 파일은 헤더에서 tchars를 컴파일 할 때 WCHARS로 해석되기 때문에이 방법이 WCHAR을 원한다고 말합니다. 여기에는 구조 내부에 정의 된 TCHARS가 포함됩니다. 실제로이 동작을 확인했습니다. TCHA 버퍼를 할당하고 통과 할 때 WCHAR 버퍼를 다중 바이트 데이터로 채우기 때문에 쓰레기를 돌려받습니다.

내 질문은 다음과 같습니다. 같은 응용 프로그램 에서이 두 라이브러리를 모두 소비 할 수있는 깨끗한 방법이 있습니까? 이 라이브러리를 어떻게 사용하는지에 대해 뭔가 잘못하고 있습니까?

도움이 되었습니까?

해결책

이 라이브러리 중 하나에서 너무 많은 클래스/기능을 사용하지 않는다고 가정하면 라이브러리 중 하나를 완전히 랩핑합니다. 앱에서 MBC를 사용하고 랩 라이브러리 B (유니 코드)를 사용하기로 결정한 경우 래퍼 헤더 파일을 사용할 수 있습니다. wchar_t 대신에 TCHAR 따라서 #Define은 인터페이스에 영향을 미치지 않습니다. #ininclude library b의 헤더, #define의 래퍼의 CPP 파일 내부 TCHAR 도서관 일치 b. 래퍼 이외의 코드는 라이브러리를 볼 수 없습니다. b.

이 두 라이브러리에서 몇 가지 이상의 클래스/기능을 사용하는 경우 래퍼 코드를 유지하면 빠르게 자체 문제가됩니다.

다른 팁

처럼 Shing Yip 제안 된, 자신의 API의 차이를 더 잘 포장하십시오. 이것은 소스 코드를 독립적으로 만듭니다.

그런 다음 래핑 API는 인코딩에서 문자를 라이브러리로 변환해야합니다. Windows에는 기능이 호출됩니다 Widechartomultibyte 그리고 같은.

가장 좋은 방법은 라이브러리 A 또는 라이브러리 B (이 예제에 대한 라이브러리 A를 말할 것)를 선택하는 것입니다. 그런 다음 라이브러리 B 헤더 파일을 포함시킬 때 #define/ #undef가 무엇이든 편집 한 내용을 확인하십시오. 그런 다음 라이브러리 A와 라이브러리 B를 동일한 데이터를 사용할 때 언제든지 변환해야합니다.

같은 방식으로 컴파일 할 수 있다면 정말 최선이 될 것입니다. 그렇지 않으면 매우 지저분해질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top