2017-01-11 16 views
-1

C++ Windows 응용 프로그램에서 클라이언트 DLL을 동적으로로드하려고합니다. 그래서 나는 ACE_DLL을 사용하고있다. 내 응용 프로그램에서 클라이언트 dll 클래스의 개체를 만들고 싶습니다. 그래서 래퍼 클래스를 작성했습니다. 멤버 함수 중 하나가 ACE_DLL의 개체를 만듭니다. 그런 다음 해당 개체를 사용하여 클라이언트 DLL을로드하고 있습니다. 다음으로 ACE_DLL 객체를 통해 symbol 함수를 호출하고 클라이언트 dll에 클래스의 생성자 이름을 전달합니다. 다음으로 생성자의 주소를 포함하는 함수 포인터 (_entry)를 호출하지만 이번에는 "처리되지 않은 예외 (액세스 위반)"로 오류가 발생합니다.처리되지 않은 예외로 오류를주는 ACE_DLL을 사용하여 클라이언트 C++ dll을 동적으로로드

내 접근 방식이 올바른지 알려주십시오. 아래는 어플리케이션의 호출 순서입니다.


ACE_DLL* _pDll; typedef Test* (*TestFP)(); TestFP _entry;


클라이언트 DLL에서 테스트 클래스 생성자의

_pDll = new ACE_DLL();

_pDll->open("dllname_to_be_opend");

std::string sSymbol = "Test"; // 변환 된 이름

가 0xc0000005 : 액세스 위반 쓰기 위치 0x00362b0c Testdll.exe에서 0x00362b2f에서

_entry = (TestFP) _pDll->symbol(sSymbol.c_str());

Test *obj = _entry(); // 처리되지 않은 예외입니다.


, 감사에 대한 권리 보이는 프라 사드

답변

1

. ACE_wrappers/tests/DLL_Test.exe를 실행할 수 있습니까? 그런 다음 테스트 코드를 더 자세히 비교하십시오.

+0

아니요. 테스트 응용 프로그램이 실행되고 있지 않습니다. 처리되지 않은 예외로 오류를 제공합니다. 나는() 메서드를 사용하여 클라이언트 dll에있는 Test 클래스 생성자의 주소를 얻은 다음이 함수 포인터를 호출하여 Test 클래스의 객체를 만들면 혼란 스럽다. –

+0

테스트 프로그램이 실행되지 않으면 빌드 문제 일 가능성이 큽니다. 환경 설정과 가장 유사한 빌드 스코어 보드 (http://www.dre.vanderbilt.edu/scoreboard/)에서 빌드 설정을 비교하고 다른 점을 확인하는 것이 좋습니다. 일단 DLL_Test를 작동 시키면 돌아가서 프로그램을 다시 시도하십시오. –

0

ACE_DLL::open 호출의 반환 값이 0인지 확인하지 않습니다 당신이

_pDll = new ACE_DLL(); 
_pDll->open("dllname_to_be_opend"); 
std::string sSymbol = "Test"; 
_entry = (TestFP) _pDll->symbol(sSymbol.c_str()); 

즉 제시 코드 (성공 0, 실패시 -1) 또는 ACE_DLL::symbol 호출의 반환 값은 0이 아닌 것을 (실패시 0이 리턴됩니다).