VC DLL 작성 및 호출의 간단한 예

5268 단어 dll

Visual Sudio 6.0을 사용하여 프로젝트를 새로 만듭니다. 프로젝트 유형은 Win32 Dynamic-Link Library입니다.임의
 
기타 모든 옵션은 기본값으로 설정
새 cpp 파일, 코드는 다음과 같습니다.
 
int add(int a ,int b)
{
      return a+b;
}

 
 
프로젝트 유형이 Win32 Console Application이면 링크를 컴파일한 후 Debug 항목이 생성됩니다.
녹음하고 안에 exe 파일이 있습니다.
 
여기서 우리의 프로젝트 유형은 Win32 Dynamic-Link Library입니다. 링크를 컴파일한 후에 우리는
Debug 디렉토리와 dll 파일이 있습니다.
 
사실은 이렇다. 우리는 depends 도구로 이 dll 파일을 열어 어떤 함수를 내보냈는지 볼 수 있다. depends
도구는 Tools 메뉴 아래에 있습니다.실제로 D:/Program Files/Microsoft Visual Studio/Common/Tools
다음 파일.우리는 이 dll에서 어떤 것도 내보내지 않았다는 것을 발견했다.왜냐하면 저희가 내보내야 할 동에 대해 설명을 안 했기 때문이에요.
서쪽그 cpp의 함수는 기본적으로 내보내지는 않습니다.왜냐하면 그것들은 우리가 내보내야 할 함수에 의해 호출될 수 있기 때문이다
내부 함수함수를 내보내려면 을 추가해야 합니다declspec(dllexport), 코드는 다음과 같습니다.
int _declspec(dllexport) add(int a ,int b)
{
       return a+b;
}

 
다시 한 번 링크하고, 이 dll 파일을 다시 보면, 하나가 있습니까?add@@YAHHH@Z의 함수입니다.이상한 것 같은데 드디어 물건을 봤어요.
지금 이 dll을 테스트해 보도록 하겠습니다.
새 프로젝트, 유형 선택 Win32 Console Application
새 cpp 파일, 코드는 다음과 같습니다.
#include <iostream.h>
#include <Windows.h>
void main()
{
      typedef int (*ADD)(int ,int);//      
      HINSTANCE Hint = ::LoadLibrary("DLL.dll");//         dll
      ADD add = (ADD)GetProcAddress(Hint,"add");//  dll   add  
      cout<<add(3,4)<<endl;
}

여기서 LoadLibrary는 모두 Windows입니다.h에 명시된 함수
링크를 컴파일해도 문제없습니다. 실행합니다.틀렸어!
분석해 봐, 프로그램이 우리 dll을 어디로 찾는지 어떻게 알아?
현재 실행 가능한 모듈이 있는 디렉터리, 현재 디렉터리, Windows 시스템 디렉터리, Windows 디렉터리를 다음과 같은 순서로 검색합니다.
GetWindowsDirectory 함수는 이 디렉토리의 경로, PATH 환경 변수에 나열된 디렉토리를 읽어들입니다.
그래서 우리는 우리의 dll을 이 테스트 프로젝트의 Debug 디렉터리로 복사한 후에 다시 실행해야 한다
역시 틀렸어!
분석해봐.저희가 아까 봤던 게 하나예요?add@@YAHHH@Z함수.그렇다면 이 때문일까?
코드를 다음과 같이 변경합니다.
#include <iostream.h>
#include <Windows.h>
void main()
{
       typedef int (*ADD)(int ,int);//      
       HINSTANCE Hint = ::LoadLibrary("DLL.dll");//         dll
       ADD add = (ADD)GetProcAddress(Hint,"?add@@YAHHH@Z");//  dll   add  
       cout<<add(3,4)<<endl;
}

 
링크를 다시 컴파일하고 실행합니다. 성공했습니다.그러면 어떻게 우리 함수의 이름을 정확하게 내보낼 수 있습니까?
dll을 생성한 프로젝트의 코드에 extern "C"를 더하면 다음과 같습니다.
extern "C" int _declspec(dllexport) add(int a ,int b)
{
       return a+b;
}

 
링크를 컴파일한 후 dll 파일을 보면 내보낸 함수가dd로 변하는 것을 볼 수 있습니다. 이 때 아래 코드는 정상적으로 작동할 수 있습니다.
 
#include <iostream.h>
#include <Windows.h>
void main()
{
        typedef int (*ADD)(int ,int);//      
        HINSTANCE Hint = ::LoadLibrary("DLL.dll");//         dll
        ADD add = (ADD)GetProcAddress(Hint,"add");//  dll   add  
        cout<<add(3,4)<<endl;
}

 
빼고declspec(dllexport)은 내보낼 함수를 가리키며 extern "C"로 이름을 정정합니다. 우리는 하나를 사용할 수 있습니다.def 파일로 상기 목적을 달성합니다.
 
dll 프로젝트에서 새 파일을 만듭니다. 형식은Text File입니다. 이름에 접미사를 붙여야 합니다.def.내용은 다음과 같습니다.
 
LIBRARY
EXPORTS
 add

 
 
나머지 절차는 이전과 같습니다. def 파일로 내보낸 함수의 이름을 바꿀 수 있습니다. 예를 들어
LIBRARY
EXPORTS
 myadd = add

 
내보내는 함수를 myadd라고 하는데,dd가 아니라 myadd라고 합니다.함수에 번호를 지정할 수도 있다
예:
LIBRARY
EXPORTS 
 myadd=add @4

 
myadd에 번호를 지정했습니다
테스트 공정에서 번호에 따라 우리의 함수를 얻을 수 있다.
#include <iostream.h>
#include <Windows.h>
void main()
{
         typedef int (*ADD)(int,int);
        HINSTANCE hInstance=::LoadLibrary("DLL.dll"); 
        ADD add=(ADD)GetProcAddress(hInstance,MAKEINTRESOURCE(4));//       

 
        cout<<add(3,4)<<endl;
        add=(ADD)GetProcAddress(hInstance,"myadd");// def        
        cout<<add(3,4)<<endl;
        FreeLibrary(hInstance);//      dll      
}

 
위에서 말한 것은 실행할 때 정적 로드 dll입니다. 다음은 시작할 때 동적 로드 dll입니다
dll을 만드는 프로젝트는 변하지 않아도 됩니다. 아니면 위에 있는 것입니까? (이름은 myadd, 번호는 4)
테스트 코드가 다음과 같이 변경되었습니다.
//먼저 DLL을lib 파일을 이 프로젝트 디렉터리로 복사
 
 
#include <iostream.h>
#pragma comment(lib,"DLL.lib")
extern int myadd(int ,int );//            (         DLL.lib)     
void main()
{
         cout<<myadd(3,4)<<endl;
}

 
 
#pragma comment(lib, "DLL.lib")는 DLL을 사용하는 데 사용할 dll을 나타냅니다.lib은 Debug에서 찾을 수 있습니다.저희도 DLL을...lib은 Debug 디렉토리가 아닌 테스트 엔지니어링 디렉토리로 복사됩니다.우리도 공사 속성에 추가할 수 있다.방법
 
Project--Settings--Link, Object/libraries Modules에 DLL.lib
extern int add(int ,int );우리의dd는 외부 함수임을 가리킨다.이 파일에 정의된 것이 아니라
 
마지막으로 복사할 파일을 정확한 곳으로 복사해야 한다고 강조한다.dll 파일이 내 말과 일치하지 않을 때 Build-Rebuild All을 선택하십시오
 

좋은 웹페이지 즐겨찾기