__declspec(dllimport/dllexport) 및 상속
문제
다음 클래스가 포함된 DLL이 제공됩니다.
#define DLLAPI __declspec(...)
class DLLAPI Base
{
public:
virtual void B();
};
class Derived : public Base
{
public:
virtual void B();
virtual void D();
};
"DLLAPI" 키워드가 클래스 정의에 적용되지 않은 경우에도(적어도 직접적으로는 아님) 내 "파생" 클래스가 dll 외부에 표시됩니까?
"D()" 함수가 표시됩니까?
감사해요
해결책
Derived 클래스는 DLL에서 내보내지지 않습니다.클래스는 내보내기를 상속하지 않습니다.여기에도 DLLAPI를 추가하세요.
클래스 멤버의 기본 접근성은 비공개이므로 어떤 메서드에도 액세스할 수 없다는 점에도 유의하세요.그러나 테스트에서는 Base::B()가 내보내지는 것을 볼 수 있습니다.DLL을 사용하는 코드의 C++ 헤더는 오류를 표시하지만 거기에서 헤더를 조정했는지, 속일 수 있는지 궁금합니다.
어쨌든 DLL 내부에서 파생 항목을 인스턴스화한 경우(다른 진입점을 통해) 가상 테이블은 계속 작동해야 합니다. 따라서 다음을 수행했습니다.
Base* b = getTheDerived(); b->B();
Derived::B()를 호출합니다.
다른 팁
입력하여 Visual Studio Command Shell에서 찾을 수 있습니다.
link /dump /exports <yourdll>
그들이 내보내면 함수에 대해 "장식 된 이름"이 표시됩니다. 그들이 인간 읽을 수있는 형식으로 무엇인지 확인하려면 하나를 복사하고
undname <decorated name>
아니요, 파생은 DLL 외부에서 보이지 않습니다. 파생 클래스를 내보내려면 Dllapi 매크로를 파생 클래스에도 적용해야합니다.
기지와 파생 클래스를 모두 수출 할 수 있도록해야합니다.
http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
All base classes of an exportable class must be exportable. If not, a compiler
warning is generated.
제휴하지 않습니다 StackOverflow