VC의 정적 및 동적 라이브러리 (IV) 동적 라이브러리 생성 및 사용 전화 디스플레이 _

삼장에 기초하여, 디스플레이 프로젝트 호출 뒤에

프로젝트 전화를 보여주기 위해 만든 :

프로젝트가 시작하도록 설정 한 후 용액에 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입니다

 

요약 :

如果需要显示调用动态库,尽量在导出函数前面加上extern "C"

而当使用第三方动态库,去GetProcAddress函数地址发现获取不到函数地址时,

可以尝试用工具去查看导出函数,以确定函数名称,以及查看相关的调用约定

추천

출처www.cnblogs.com/fzxiaoyi/p/12055883.html