2010-12-13 2 views
3

C++에서 DLL이 DLL을로드 한 응용 프로그램의 일부 심볼에 액세스 할 수 있습니까? 나는 플러그인 (dll)을로드하는 응용 프로그램을 가지고 있으며 이러한 플러그인은 응용 프로그램의 일부 API에 액세스해야합니다.DLL이 해당 응용 프로그램의 심볼에 액세스해야합니다.

이 API를 공유하는 새 DLL을 만들지 않고도이 작업을 수행 할 수 있습니까?

이 상황에서 함수 포인터의 구조체가 적합합니까?

예 : 호스트 응용 프로그램에 정의 된 bool Log (char *) 함수 및 일부 이벤트를 기록해야하는 플러그인.

답변

2

콜백 인터페이스를 플러그인 DLL에 전달하기위한 또 다른 투표. 나는. 콜백 인터페이스 ...

class IHostApplication 
    { 
    public: 
    virtual bool Log(const wchar_t* ip_log_string) = 0; 
    }; 

호스트가 그 플러그인 DLL을 (동적 필요한 경우)을로드하고 것이다 인터페이스

class IPlugin 
    { 
    public: 
    virtual void InitializePlugin(IHostApplication *ip_host) = 0; 
    }; 

DLL이 플러그는 플러그에 IHostApplication * 자체를 전달 원하는 콜백을 가능하게합니다.

+2

+1하지만 C++ 위에 플러그인 아키텍처를 빌드하는 것이 좋은 선택입니까? 플러그인은 동일한 C++ 컴파일러로 빌드해야합니다 (버전이 아닌 경우 최소 제조사). –

+0

당신이 C 스타일 인터페이스로 제한하는 경우에는 항상 "C"를 extern "C"할 수 있습니다. 그러나 이것은 절충점입니다. 나는 COM을 제안 할 것이다. 그러나 나는 똑바로 얼굴로 그렇게 할 수 없다. :) –

1

가능한 일이지만 디자인 선택에 의문의 여지가 있습니다.

EXE는 DLL과 같은 방식으로 함수를 내보낼 수 있으므로 익숙한 방식으로 GetProcAddress를 사용할 수 있습니다.

그러나 플러그인이 호스트 프로그램의 내부 기능에 대해 알아야 할 필요가있는 이유는 무엇입니까? 그것은 다른 방향 일 것입니다.

호스트는 특정 계약을 준수하는 일련의 루틴 (내보내기)을 호스트에 구현해야합니다. 인터페이스의 일부로서, 호스트는 필요한 경우 호스트 고유 정보를 구조체 (예 : 버전 정보, 기능)에 대한 포인터로 전달할 수 있습니다.

플러그인은 호스트 모듈에 대한 기능 포인터를 획득하려고 시도하면 안됩니다.

+0

피해는 어디입니까? 플러그인은 어쨌든 매우 구체적인 계약을 준수해야하며 호스트 응용 프로그램을 제외한 다른 사용자가 플러그인을로드하는 경우 작동하지 않을 수 있습니다. 실행 파일이 플러그인에 대한 일부 기호를 호출하는 경우 많은 위험을 볼 수 없습니다. –

0

콜백 함수 포인터, 콜백 함수 포인터 목록 또는 콜백 인터페이스 포인터 -이 옵션 중 하나를 사용합니다. DLL 클라이언트는 콜백 인터페이스를 구현하고 동적으로 생성 된 DLL에이 인터페이스에 포인터를 전달해야합니다. 동적으로 생성 된 Dll은이 포인터를 유지하고 필요한 경우 예를 들어 일부 이벤트를보고하기 위해 해당 함수를 호출합니다.

관련 문제