2012-07-19 3 views
0

여러 파일 형식으로 읽고 데이터를 병합해야하는 응용 프로그램을 개발 중입니다. 나중에 추가 형식을 지원하기를 원할 수 있으므로 파일 판독기를 DLL로 개발하고 사용자 입력을 기반으로 런타임에로드해야합니다. 일반적으로 한 번에 두 개의 DLL을로드합니다.
추상 인터페이스 (Like this)를 만들 수 있다고 생각했지만 두 개의 DLL을로드 할 때 각각의 (하위 클래스의) DLL 클래스에서 팩토리 함수를 사용하면 두 함수 정의가 서로 간섭합니다. 내가 놓친 게 있니? 이 작업을 수행하는 더 좋은 방법이 있습니까?DLL에서 C++로 서브 클래 싱

감사합니다.

+1

LoadLibrary를 사용하여 DLL을로드하고 GetProcAddress를 통해 팩토리 함수에 대한 포인터를 가져 오는 경우 상상해 보시는 것처럼 문제가되지 않습니다. 다른 DLL/EXE에서 DLL/EXE에 할당 된 메모리를 절대로 출시 할 수는 없습니다. – MFH

+0

@MFH, 좋은 답변입니다. 왜 댓글을 쓰시겠습니까? – eran

+0

@eran 고마워, 내가 그랬어 :) – MFH

답변

1

(코멘트에서 업그레이드)

당신이 LoadLibrary으로 DLL을로드하면 당신은 DLL에 대한 핸들 얻기 - 나중에 DLL을 언로드 FreeLibrary에 사용해야합니다!

핸들을 획득 한 후 GetProcAddress을 호출하여 함수에 대한 포인터를 얻을 수 있습니다.

샘플 코드 : 이미 주석에서 언급 한 바와 같이

auto library = LoadLibrary("sample.dll"); 
//test if library is null => error handling 
auto func = GetProcAddress(library, "function"); 
//test if func is null => error handling 
//you may need to cast func to a different function pointer 
auto plugin = func(); 



//after use: 
auto result = FreeLibrary(library); 
//test for error 

: 이제까지 ANOTHER CONTEXT (다른 DLL 또는 EXE)에서 DLL에 할당 된 메모리를 해제하지 마십시오!

+0

고마워! DLL을 많이 사용하지는 않았지만 가져온 함수에 대한 포인터를 가져올 필요성을 완전히 잊었습니다. – JeffW