문제

다음 클래스가 포함된 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.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top