2012-12-06 3 views
2

동적 라이브러리의 함수에 액세스하려고합니다. 즉, Person 인스턴스를 인스턴스화하고 포인터를 void 포인터로 반환합니다. 그런 다음 프로그램은 reinterpret_cast를 사용하여 void 포인터를 Person에 캐스트해야합니다. 그러나 오류가 발생합니다 : 오류 : 'void *'는 (는) 포인터와 개체 유형이 다릅니다. 라이브러리에서오류 : 'void *'는 포인터 간 객체 유형이 아닙니다.

기능 :

void* loadPerson (void) { 
    return reinterpret_cast<void*>(new Person); 
} 

MAIN.CPP :

void* loadPerson = dlsym(lib_handle, "loadPerson"); 
void* person_vp = (*loadPerson)(); 
Person* person = reinterpret_cast<Person*>(person_vp); 

if (dlerror() != NULL) 
    cout<<"Library init error."<<endl; 
else { 
    //... 

덕분에 여기

코드입니다!

답변

2

문제가있는 라인이다 : 당신은 void*를 역 참조하고

void* person_vp = (*loadPerson)(); 

. 당신이 필요합니다

void* person_vp = (*reinterpret_cast<void* (*)()>(loadPerson))(); 

편집 :

더 나은 가독성을 위해, 캐스트는 다음과 같이 나눌 수 있습니다 :

typedef void* VoidFunc(); 
VoidFunc* loadPerson_func = reinterpret_cast<VoidFunc*>(loadPerson); 
void* person_vp = (*loadPerson_func)(); 
+0

좋은 대답,하지만 난 함수 포인터 변수를 추가합니다 그래서 프로세스가 더 명확합니다. –

+0

@JonathanGrynspan 감사합니다. 대답을 확장했습니다. – Angew

+0

@Agnew NetBeans에서 'RUN FAILED (종료 값 1)'오류가 발생했습니다. [this] (http://www.drdobbs.com/dynamically-loaded-c-objects/184401900) 자습서에 따르면, (* loadPerson)()과 같은 함수를 호출해야합니다.이 함수는 값을 반환하기 때문에 할당됩니다. 'person_vp' 포인터. 내가 여기서 무엇을 놓치고 있니? –

관련 문제