2016-10-06 10 views
2

전문 직업에서 처음으로 우리는 기본, 일반적인 소프트웨어 및 고객이 원하는 방식으로 작동하도록하는 인터페이스가 포함 된 고객에게 DLL을 제공해야합니다. 고객이 입력 및 판독 출력을 공급할 수 있습니다.고객과 함께 C++ DLL 및 H 파일 공유

여기 내 큰 문제는 내 고객에게 지적 재산권 때문에 절대적으로 알 필요가없는 것을 보여주지 않을 수도 있다는 것입니다. 여기에는 데이터 유형이 포함되어 있으므로 내부적 방법에 대한 서명도 표시 할 수 없습니다. 필자는 내부 유형을 모방 한 데이터 유형과 구조를 만들었지 만, 예를 들어 자발적으로 불필요한 속성/요소를 생략하거나 사적인 내부 논리에 대한 힌트를 숨기기 위해 다른 이름을 부여합니다. 그리고 나서 데이터를 얻는 메소드는 우리 자신의 데이터 구조를 맵핑하고 그것들에 입력합니다. 너는 그림을 얻는다.

순수한 소프트웨어 아키텍처 관점에서 보면, 나는 그가 특정 구성원, 속성, 변수에 액세스하는 것을 원하지 않습니다. 왜냐하면 그 사람이 존재한다는 것을 알 필요가 없기 때문입니다. 그가 기뻐할 때, 그가 기뻐할 때 그들을 수정하십시오. 그러나 그것들은 그 인터페이스와 전적으로 관련이 있으며 우리의 내부 소프트웨어의 일부가 아닙니다.

제가 지금 가지고있는 것은 인스턴스로 만들 수있는 인터페이스 역할을하는 클래스입니다. 그것은 기본적으로 출력을위한 메소드를 얻고, 입력을 공급하고 업데이트 계산을 시작하는 메소드와 다른 매개 변수 및 값 (소프트웨어 버전 또는 현재 상태와 같은)에 대한 getter 및 setter를 제공합니다. 이러한 매개 변수 및 다른 변수에 대한 실제 데이터 변수는 DLL로 컴파일 된 CPP 파일에 숨겨져 있으므로 H 파일의 인터페이스로 사용하는 클래스의 특성으로 선언되지도 않습니다. 사적인 것으로서 그는 그들에 대해 모른다. 그는 단지 getter와 setter만을 가지고있다.

여기에서 어떤 디자인 패턴을 사용해야합니까? 실제로 내 변수를 내 고객과 공유하는 H 파일에 클래스의 속성으로 비공개로 넣을 수 있습니까? 그렇다면 그는 개인을 공개적으로 변경하고 클래스에 대한 새로운 메소드를 작성하고 컴파일러에 불평하지 않고 자유롭게 수정할 수 있습니까? 다른 방법으로 수업에 참여하고 CPP 파일이나 액세스 할 수없는 다른 H 파일로 확장 할 수 있습니까?

많은 질문이 있습니다. 새로운 질문입니다. 그러나 당신은 일반적인 그림을 얻습니다 : 나는이 H 파일에서 고객과 최대한의 최소한의 정보를 공유하기를 원하기 때문에 DLL을 만들고 데이터 출력을 얻을 수 있습니다. 그리고 더 이상. 사전에

감사, 내가 여기에 사용해야 어떤 디자인 패턴

답변

2

찰스?

자세한 내용은 pimpl idiom을 참조하십시오.

내 변수를 개인용으로 내 고객과 공유하는 H 파일에 실제로 넣을 수 있습니까? 그렇다면 그는 개인을 공개적으로 변경하고 클래스에 대한 새로운 메소드를 작성하고 컴파일러에 불평하지 않고 자유롭게 수정할 수 있습니까?

예, 그렇습니다. 여드름 치료는 여전히 가능하지만 훨씬 더 어렵고 역 공학이 필요합니다.

+0

이것은 DLL 질문을 전혀 다루지 않습니다. –

+0

읽어보십시오. 그래서 이것은 기본적으로 숨기고 싶은 변수를 포함하여 구현 본문의 전방 선언에 의존합니다. 선언은 1. 컴파일 과정의 후반 단계로 연기되었으므로 오류가 아직 발생하지 않았으며 2. 고객과 공유하지 않는 다른 파일 내 고객이 구현 본문을 선언하지 않고 H 파일을 가지고 있고 내부에 선언 (및 정의)이 포함 된 DLL이있는 경우 컴파일 할 수 있습니까? – Charles

+0

@ Moo-Juice 그건 내가 두려워하는거야. 다시 말하지만, 누군가가 더 좋은 제안을하지 않는다면 내 고객은 자신이 필요로하는 수출 물건을 선언하는 DLL과 H 파일 만 갖게됩니다. – Charles

4

먼저, DLL 경계에서 STL 클래스와 C++ 인터페이스를 갖는 것으로, 순수 C 인터페이스와 DLL을 구축 고려해야하는 것은 제약 매우 (예를 들어, 클라이언트가 같은 비주얼 C를 사용하는 ++ 컴파일러입니다 DLL을 빌드하는 데 사용한 것과 동일한 CRT 형식으로 동적으로 링크).

이 시점에서 고객에게 C++ 구현 (DLL로 컴파일되어 바이너리로 제공됨)을 숨기거나 숨길 얇은 레이어를 자유롭게 개발할 수 있습니다.

DLL에 의해 노출 된 C 인터페이스 계층을 Win32 pure-C API 함수의 ATL 및 WTL과 같은 멋진 C++ 개체 지향 방식으로 래핑 할 수있는 간단한 공용 헤더 파일을 제공 할 수도 있습니다.

+0

실제로 컴파일러 전체에 걸쳐 이름 변경 패턴이 다양하기 때문에 실제로 문제가 발생했습니다. 어제보다 늦게 고쳐졌습니다. 내 고객처럼 Visual Studio Express 2015에서 컴파일하는 것을 알고 있습니다. 우리는 아직 C++ 인터페이스로 되돌리기를 시도하지 않았습니다. 그리고 만약 내가 실제로 C 인터페이스에 국한시키고 내 모든 오브젝트를 소스 파일에 정적 변수로두면 괜찮습니다. 그러나 이제는 C++을 사용할 수 있다고 생각하기 때문에 문제가 다시 발생합니다. – Charles

+0

@Charles : 이름 차이에 대한 차이뿐만 아니라보다 심오한 문제에 대해서도 다룹니다. 서로 다른 버전의 Visual Studio간에 STL 데이터 구조의 _implementations_을 서로 다릅니다. 정적 변수는 필요 없습니다. C 함수에서 C++ 클래스 메쏘드를 래핑 할 수 있습니다 (예를 들어'MyClass' ctor는'MyClass_Create()','MyClass :: DoX()'는'MyClass_DoX()'가됩니다),'this' 포인터를 불투명 한 포인터. –

+0

좋아, 그래서 당신은 분명히 C++ 메소드의 배경에있는 C 메소드리스트에 의지해야한다고 분명히 말하고있다. 그래서 기본적으로 우리가 지금 가지고있는 것은 당신이 묘사 한 것과 매우 흡사합니다. – Charles