문제

DLL에서 C++ 클래스를 가져오는 올바른 방법은 무엇입니까?우리는 Visual C++를 사용하고 있습니다.

dllexport/exports.def+LoadLibrary+GetProcAddress 세 가지가 있지만 C++ 클래스에서는 작동하지 않고 C 함수에서만 작동합니다.C++ 이름 변경 때문인가요?이 작업을 어떻게 수행합니까?

도움이 되었습니까?

해결책 2

해결책을 찾았습니다. http://www.codeproject.com/KB/DLL/XDllPt4.aspx

여러분의 노력에 감사드립니다

다른 팁

다음을 추가해야 합니다.

extern "C"
{
...
}

함수 맹글링(mangling)을 피하기 위해.

두 가지 간단한 C 함수 작성을 고려할 수 있습니다.

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

해당 기능만 사용하면 나중에 개체 생성/삭제 기능을 추가/변경할 수 있습니다.이를 공장(Factory)이라고도 합니다.

나는 일반적으로 인터페이스 기본 클래스를 선언하고 내 응용 프로그램에서 이 선언을 사용한 다음 LoadLibrary, GetProcAddress를 사용하여 팩토리 함수를 가져옵니다.요소는 항상 인터페이스 유형의 포인터를 반환합니다.

다음은 실제적인 예입니다. DLL에서 MFC 문서/뷰 내보내기, 동적으로 로드됨

확인해 보세요 이 질문.기본적으로 두 가지 방법이 있습니다._dllexport를 사용하여 클래스를 표시한 다음 가져오기 라이브러리와 연결하면 DLL이 자동으로 로드됩니다.또는 DLL을 직접 동적으로 로드하려면 @titanae가 제안한 팩토리 함수 아이디어를 사용할 수 있습니다.

dllexport/dllimport가 작동하면 헤더 파일의 클래스 이름 앞에 배치하면 됩니다.

일반적으로 dll에서 dllexport를 사용하고 exe에서 dllimport를 사용하려고 합니다(그러나 어디에서나 dllexport를 사용할 수 있고 작동하므로 '제대로' 수행하면 로드 속도가 아주 조금 더 빨라집니다).

분명히 그것은 링크 타임 컴파일을 위한 것입니다./delayload 링커 지시문을 사용하여 '동적'으로 만들 수 있지만 제목 줄에서 원하는 것은 아닐 수도 있습니다.

정말로 LoadLibrary 스타일 로딩을 원한다면 "extern C" 래퍼로 C++ 함수를 래핑해야 합니다.문제는 이름 조작으로 인해 완전히 조작된 이름을 입력해도 작동한다는 것입니다.

해결 방법은 일반적으로 올바른 클래스에 대한 포인터를 반환하는 C 함수를 제공하는 것입니다. COM은 dll의 개체 내부에서 인터페이스 메서드를 가져오는 데 사용되는 dll에서 4개의 C 함수를 내보내므로 이러한 방식으로 작동합니다.

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