문제

대부분의 C / C ++ 개발에는 모 놀리 식 모듈 파일이 포함되며 클래스가 전혀 없습니다. 따라서 일반적으로 액세스 가능한 함수로 DLL 을 만들어야 할 때 표준 __declspec(dllexport) 지시문을 사용하여 내보내기 만하면됩니다.그런 다음 LoadLibrary()를 통해 동적으로 액세스하거나 헤더 및 lib 파일을 사용하여 컴파일 타임에 액세스합니다.

전체 클래스 (및 모든 공용 메서드 및 속성)를 내보내려면 어떻게해야합니까?

런타임에 해당 클래스를 동적으로로드 할 수 있습니까? 그렇다면 어떻게해야합니까?

컴파일 타임 링크를 위해 헤더와 lib로 어떻게할까요?

도움이 되었습니까?

해결책

<인용구>

늦은 구속력은 어떻습니까? 로딩 중 LoadLibrary () 및 GetProcAddress ()? 나는 할 수있다 런타임에 라이브러리를로드하고 그렇게 할 수 있다면 좋을 것입니다. 여기.

따라서 DLL을로드하는 방법에는 두 가지가 있습니다. 첫 번째는 DLL (예 : 클래스 이름)에서 하나 이상의 기호를 참조하고 적절한 가져 오기 .LIB를 제공하고 링커가 모든 것을 알아 내도록하는 것입니다.

두 번째는 LoadLibrary를 통해 명시 적으로 DLL을로드하는 것입니다.

두 방법 모두 C 수준 함수 내보내기에 적합합니다. 링커에서 처리하도록하거나 언급 한대로 GetProcAddress를 호출 할 수 있습니다.

하지만 내 보낸 클래스 의 경우 일반적으로 첫 번째 접근 방식 (예 : 암시 적으로 DLL에 연결) 만 사용됩니다. 이 경우 DLL은 응용 프로그램 시작 시간에로드되며 DLL을 찾을 수 없으면 응용 프로그램이로드되지 않습니다.

DLL에 정의 된 클래스에 연결하고 DLL을 동적으로로드하려면 프로그램 시작 후 언젠가는 두 가지 옵션이 있습니다.

  1. 특수 팩토리 함수를 사용하여 클래스의 객체를 만듭니다. 내부적으로 어셈블러를 사용하여 새로 생성 된 객체를 적절한 오프셋에 "연결"해야합니다. 이것은 분명히 DLL이로드 된 후 런타임에 수행되어야합니다. 이 접근 방식에 대한 좋은 설명은 여기 에서 찾을 수 있습니다.

  2. 지연로드 DLL 을 사용합니다. p>

    모든 사항을 고려합니다. 암시 적 링크를 사용하는 것이 더 낫습니다.이 경우 위에 표시된 전 처리기 기술을 사용하고 싶을 것입니다. 실제로 Visual Studio에서 새 DLL을 만들고 "기호 내보내기"옵션을 선택하면 이러한 매크로가 자동으로 생성됩니다.

    행운을 빕니다 ...

다른 팁

DLL과 DLL을 사용할 모듈을 빌드 할 때 하나와 다른 것을 구별하는 데 사용할 수있는 일종의 #define을 사용하면 클래스 헤더 파일에서 다음과 같이 할 수 있습니다.

라코 디스

편집 : crashmstr이 나를 이겼습니다!

일부 매크로를 사용하여 코드 가져 오기 또는 내보내기를 표시합니다. 라코 디스

그런 다음 헤더 파일에서 클래스를 선언합니다. 라코 디스

그런 다음 라이브러리의 #define ISDLL, 클래스를 사용하려는 위치에 헤더 파일을 포함하기 전에 USEDLL.

LoadLibrary로 작업하기 위해 다른 작업이 필요한지 모르겠습니다.

DLL에서 C ++ 클래스를 내보내는 간단한 작업 예제 추가 :

아래의 예제는 dll과 exe가 서로 상호 작용하는 방법 (자체 설명)에 대한 간략한 개요 만 제공하지만 프로덕션 코드로 변경하려면 추가 할 항목이 더 필요합니다.

전체 샘플 예제는 두 부분으로 나뉩니다.

A..dll 라이브러리 (MyDLL.dll) 만들기

B..dll 라이브러리 (응용 프로그램)를 사용하는 응용 프로그램 만들기

A..dll 프로젝트 파일 (MyDLL.dll) :

1.dllHeader.h 라코 디스

2.dllSrc.cpp 라코 디스

B.이미 생성 된 .dll 파일을로드하고 링크하는 애플리케이션 프로젝트 : 라코 디스

최근에 정확히 같은 질문을하고 결과를 요약했습니다. 블로그 게시물 .유용 할 수 있습니다.

여기에서는 DLL에서 C ++ 클래스를 내보내고 LoadLibrary를 사용하여 동적으로로드하는 방법을 다루고 메모리 관리, 이름 변경 및 호출 규칙과 같은 일부 문제에 대해 설명합니다.

내보내는 클래스에 vtable을 넣으려는 경우 인터페이스를 반환하는 함수를 내보내고 .dll에서 클래스를 구현 한 다음 .def 파일에 넣을 수 있습니다.선언 속임수를 사용해야 할 수도 있지만 너무 어렵지는 않습니다.

COM과 같습니다.:)

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