2016-06-21 2 views
2

생성자를 던져서 DLL 경계를 넘어서 던지는 것에 대해 몇 가지 질문이 있지만이 특정 상황에 대한 대답은 찾을 수 없습니다.DLL 경계를 넘어 생성자에서 예외를 throw하는 것

두 가지가 내가 읽은 : 뭔가 나쁜 일이 생기면

  1. 생성자는 예외가 발생합니다. 이렇게하면 객체가 좀비 상태에 있지 않고 객체의 상태를 확인하는 함수가 필요 없으며 RAII가 실행됩니다. 모든 좋은 것들.

  2. DLL 경계를 넘겨서는 안됩니다. 힙 메모리는 공유되지 않으며 나쁜 일이 발생할 수 있습니다. 이것의 세부 사항은 나에게 조금 벗어났다. 그러나 도처에 일반적 충고는 그것을하지 않는다. 그래서 나는 실용하지 않는다. 예외 (!)는 모든 코드가 동일한 컴파일러로 컴파일 될 때 발생하지만 컴파일러에 따라 다르므로 신뢰성이 떨어지는 것입니다. 오류 코드입니다!

이제 내 질문 :

가 어떻게 안전하게 DLL 어딘가에 정의 된 클래스의 인스턴스를 만들려면 어떻게해야합니까?

아마도이 작업을 수행하는 유일한 방법은 DLL의 모든 (내보내기 된) 생성자가 예외를 발생시키지 않거나 NULL 일 수있는 개체에 대한 포인터를 반환하는 수출 된 자유 함수를 제공하도록 약속하는 것입니다. 예외가 캐치되었을 경우

누군가가 더 적합한 것을 제안 할 수 있습니까, 아니면 내가 스틱의 끝이 잘못됐다고 말할 수 있습니까?

+0

exe와 dll이 동일한 버전의 런타임 지원을 사용하고 정적 버전이 아닌 dll 버전인지 확인해야합니다. –

+2

읽을만한 가치가있는 가치가있는 [DLL의 클래스 사용법] (http://stackoverflow.com/questions/4555961/how-to-use-a-class-in-dll). 거의 모든 질문에 대한 답변과 아직 생각하지 못한 몇 가지 사항에 대한 답변입니다. – user4581301

+0

잘못된 버전의 dll로 인해 문제가 발생할 수 있기 때문에 클래스를 내보내고 싶지 않습니다. 그러나 클래스가 내 보낸 함수를 구현하는 데 내부적으로 사용되면 괜찮습니다. 위의 주석 링크는 인터페이스 만 내보내는 것을 피합니다. –

답변

1

나는 귀하의 접근 방식이 올바른 것이라고 생각합니다. 객체 대신 객체를위한 팩토리를 내보내겠습니다.

Btw 그래서 각 DLL에 대해 동일한 이름의 내보내기 기능을 가질 수 있도록 투영 될 수 있습니다. 그래서 해당 내보내기 함수 내에서 DLL의 모든 팩토리를 통해 열거하고 요청 된 개체를 생성하려고 시도하는 if-else 블록을 가질 수 있습니다. (객체가 이름, crc32, 이름 해시 등으로 식별된다고 가정 해 봅시다.)

여기에는 여러 가지 방법이있을 수 있습니다. 예를 들어, 일반적인 내 보낸 함수 대신 DLLMain/Attach 이벤트의 공통 개체에 각 DLL 팩토리를 등록하거나 사용자 지정 DLLMain 이벤트를 처리하여 Neo 개체 주소를 매개 변수로 넣을 수 있습니다 DLLMain을 사용하고 각 DLL에 대해 정확한 팩토리를 등록하십시오.

하지만 공통점은 개체가 ctor/init 메서드에서 expection을 throw 할 수있는 경우에 팩터 리를 사용하는 것입니다.

+2

나는 클래스 객체를 생성하기위한 팩토리 함수를 제공하는 dll을했지만 포인터는 핸들로만 제공한다. 클래스 자체는 내 보내지 않으며 내 보낸 함수를 통해서만 사용할 수 있습니다. –