삼장에 기초하여, 디스플레이 프로젝트 호출 뒤에
프로젝트 전화를 보여주기 위해 만든 :
프로젝트가 시작하도록 설정 한 후 용액에 1. 생성, 동적 라이브러리를 테스트하기위한 새로운 콘솔 프로젝트 DisplayCall를 추가
2.DisplayCall.cpp는 관련 코드를 추가 한. // DisplayCall.cpp : 사용자 정의 콘솔 응용 프로그램의 진입 점.
2 // . 3 . 4 사용법 #include " STDAFX.H " 5. #INCLUDE <WINDOWS.H> // WINDOWS.H 포함해야 6. 7. 타입 정의의 INT (* PFUNC_MathSub) ( INT , 지능 ) // 함수 포인터의 정의 . 8 . 9 INT _tmain ( 의 INT 는 argc, _TCHAR * argv와 []) 10 { 11. HMODULE가 :: =는에서 LoadLibrary (_T (hmdll " ../Debug/DynamicLibrary.dll는 " )); //는 동적 로딩 DLL (12)는 IF (! hmdll)가 13 인 { 14 의 printf ( " LoadDLL IS 실패 " ); 15 } 다른 16 { . 17 // 캐스트 함수 포인터 동적 라이브러리의 서브 함수 주소를 가져 18 인 PFUNC_MathSub pfMathSub = (PFUNC_MathSub) ::의 GetProcAddress (hmdll, " MathSub " ) 19. INT nResult pfMathSub = ( 5. , 3. ); // 함수 포인터를 호출 (20)이 의 printf ( " 5 - 3 % = D.. " 상기 nResult)
21 FreeLibrary를 :: (hmdll)이고; 22이다 } 23는 getchar가 (); 24 반환 0 ; 25 }
3. 컴파일 및 DisplayCall 실행하고 비정상적인 것을 발견?
인터럽트 라인 (19)에 침입 움직임을 찾아 클릭 4. 마우스 pfMathSub는 MathSub의 함수 주소를 0으로 지시의 값을 취득하지 않는 것을 발견
함수의 이름을 잘못 입력되지 볼 동적 라이브러리 헤더 파일을 엽니 다? 함수 이름을 올바르게 ...
그 이유는 실제 함수 이름과 코드가 동일하지 않은 경우에 진짜 원인 버그는 C ++ 컴파일러 기능에 의해 생성 된 함수 이름을 생성한다는 것이다
함수 이름을 생성 할 때 다음 동적 라이브러리 프로젝트 사용 된 C ++, 그때는 C ++ 컴파일러에 의해 생성되는 모드
여기서 당신은 DLL 정보를 볼 수 달려 사용할 수 있지만, 반드시 vs2012 도구에서, 그것은 단지 타사 도구를 빌릴 수
원래 C ++ 함수 : INT MathSub (INT A, INT의 b) 컴파일러 함수명 :? MathSub @@ YAHHH @ Z
C ++ 함수 이름을 기반으로? 처음에는, 다시 함수 이름을 유지하기 위해, 다음 @@ YA는 기본 __cdecl 호출 C ++의 약자,
결국 마지막 @z이다에서 두 파라미터 타입은 리턴 값의 INT, INT 타입이며, 뒤에 H 스탠드
테스트 6.이 올바른지 여부, 코드를 수정하려면 GetProcAddress를 함수 이름이 두 번째 인수로 변경되었습니다? MathSub @@ YAHHH @ Z
F5는 실행에 성공적으로 함수 MathSub를 호출 발견
각각의 호출이 너무 복잡이 방법을 사용하는 동적 라이브러리 함수 경우 7. 갑자기 또 다른 간단한 방법에 출현
기능 추가 통근자 "C"앞에 동적 라이브러리 헤더 파일을 수정, 기본 C ++ 컴파일 모드를 사용하지 컴파일러를 알려줍니다,
방법은 C 언어 컴파일러를 사용합니다. 마지막으로 동적 라이브러리 프로젝트를 재 컴파일
8. DisplayCall.cpp의 뒤에 실행 다시 다음 F5 키를 코드를 변경, 이상이 사라 찾기
9. 마지막으로이 도구는 다음 통근자 "C"기능 수정 된 컴파일러 함수 이름을 사용하여보고 어떤 종류가된다?
함수 이름 중 C 언어 컴파일러의 방법은 우리가 쉽게 함수의 주소를 얻기 위해 GetProcAddress를 사용할 수 있도록, MathSub입니다