2012-06-02 2 views
0

Java에서 플러그인과 같은 것을 만들 수있는 방법이 있는지 궁금해서 주 프로그램이 하위 프로그램을로드하고 해당 기능을 실행합니다. 몇 가지 가치를 반환하는 작은 프로그램 세트에 대해 생각했지만 플러그인으로 하여금 주 프로그램 개체 중 일부를 수정할 수있게하려고합니다. 어쨌든 포인터를 전달할 수 있습니까?Cpp의 플러그인 - 외부 프로그램 기능 실행

이렇게 할 방법이 있습니까?

답장에 대한 고맙습니다.

답변

1

런타임에 동적으로 링크 된 라이브러리 (DLL : Windows의 s) 형태로 코드를 동적으로로드 할 수 있습니다.

  • 로드 실행에서 생성 된 파일 (__declspec (dllexport)로 선언 된) 일부 수출 기능 DLL을 만들기 : 내가 사용하는 (적어도 윈도우 처리)

    접근이에 관한 것입니다 Windows API의 LoadLibrary 함수를 사용하여 시간 -

  • 함수 이름을 함수 이름으로 사용하여 GetProcAddress-function 함수를 사용하여 이름을 사용하여 함수 포인터에 함수 포인터를 가져옵니다.

마지막 부분은 C++에서 반환 형식 등을 추적하기 위해 이름 - mangling을 사용하기 때문에 약간 혼동 스러울 수 있습니다. 즉, DLL에 저장된 이름은 함수의 이름이 아니라 함수의 매개 변수 유형과 같은 것에 대한 설명도 포함하는 이름입니다.

는, 그러나

extern "C" __declspec(dllexport) int myFunction(...); 

, 당신은 통근자 "C"로 내 보낸 함수를 선언 할 수 있습니다, 등을 이름 맹 글링을 방지하기 위해이 함수 선언에서 클래스를 허용하지 않습니다.

동적으로 링크 된 라이브러리와 "주 프로그램"사이에서 데이터 구조에 대한 포인터를 전달할 때 고려해야 할 중요한 사항은 형식의 선언이 두 파일에서 동일하다는 것을 확인하는 것입니다 (헤더를 공유하여 쉽게 수행 할 수 있음) 형식을 선언), 그렇지 않으면 프로그램을 실행할 때 심각한 오류가 발생합니다.

다시 말하지만 Windows에 따라 다를 수 있지만 시스템에서 올바른 절차를 알 수 있습니다.

+0

비 윈도우 용으로는 어떤 방법이든 사용할 수 있습니까? –

+0

그것은 모든 플랫폼에서 거의 같습니다. C++보다는 "C"이름 - mangling을 사용합니다. 플러그인은 예외를 throw 할 수 없으며, 클래스와 메소드를 명시 적으로 구조체 및 함수로 포인터를 쓰는 등의 방식으로 작성할 수 있습니다. . dlopen (또는 LoadLibrary)은 파일을 주소 공간에로드하고 dlsym (또는 GetProcAddress)은 내 보낸 심볼 목록에서 함수 포인터를 찾습니다. 매우 깔끔하고 명확합니다. Java와 같은 언어보다 더! –

+0

잠깐, DLL을 사용하면 Linux에서도 사용할 수 있으며 플러그인에서 기본 프로그램 사용자 정의 클래스를 수정할 수 있습니까? –

관련 문제