Dll 시작

3888 단어 dll
어떤 것들은 반드시 손을 써서 실현해야 한다. 학습의 어떤 점은 천천히 축적할 수 있지만 일부 기본적인 맹점은 반드시 뛰어넘지 말아야 한다.
 
여기에는 Dll의 내용을 많이 설명하지 않고, 단지 자주 사용하는 두 가지 dll 작성 방법을 기록할 뿐이다.
 
하나.Dll의 작성
 
첫 번째 방법:
우선 vs 2010--->win32 응용 프로그램 --->dll 프로젝트 (MyDll) ---->빈 프로젝트를 선택하지 말고 dllmain 함수 입구를 생산하도록 하세요.네가 익숙해진 후에도 스스로 쓸 수 있다.
 
// dllmain.cpp
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

첫 번째 방법은 extern "C"를 사용합니다declspec(dllexport) 방식은 가감법을 예로 들 수 있습니다.
 
  
// MyDll.cpp
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}

두 번째 방법:
 
(1) 아래의 설명을 제거한다
//extern "C" _declspec(dllexport) int Max(int a, int b);
//extern "C" _declspec(dllexport) int Min(int a, int b);

(2) Min, Max 함수 앞에 extern "c"를 붙이고 함수를 내보내려면 반드시 이런 방식으로 써야 하며 오류가 발생하지 않도록 해야 한다.
extern "c" int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
extern "c" int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}

(3) 추가.def 파일, 이 파일에 출력 함수를 표시합니다. (내 vs 자동으로 추가할 수 없기 때문에 로컬에서 수동으로.def 파일을 만들고 프로젝트 설정 속성인 Link-->Input--->Module Definition File에서.def 파일 이름을 설정합니다.)
;
; Cmpnt1 module-definition file
;

LIBRARY         MyDll.dll
DESCRIPTION     '(c)1996-1997 Dale E. Rogerson'

EXPORTS
                Min @1	PRIVATE
                Max @2  PRIVATE

직접 Build 프로젝트는 디렉터리에서 상응하는 것을 생성할 수 있습니다.lib 및.dll 파일.
 
둘.Dll 호출
(1) 암시적 링크.
스텔스 링크는 프로그램이 실행될 때 DLL 파일을 응용 프로그램에 불러오는 것입니다.함수 키워드만 가져오면declspec (dllimport) 함수 이름 등은 응용 프로그램의 헤더 파일에 쓰면 됩니다.이런 방법은 필요하다.lib 파일도 테스트 공정으로 복사합니다.
#pragma comment(lib,"Messagebox.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
#include <windows.h>
#include<stdio.h>
int main()
{
int a;
a=Max(8,10);
printf("      %d
",a); a=Min(8,10); printf(" %d
",a); return 0; }

(2) 동적 링크
동적 링크는 복사할 필요가 없습니다.lib 파일을 테스트 프로젝트 디렉터리로 이동합니다.동적 링크는 프로그램에서 동적 마운트, 동적 마운트 해제로 메모리 사용을 줄일 수 있습니다.응용 프로그램에서 LoadLibrary 또는 MFC가 제공하는 AfxLoadLibrary로 자신이 만든 동적 링크 라이브러리를 현저하게 불러옵니다.그런 다음 GetProcAddress()를 사용하여 가져올 함수를 가져옵니다.프로그램이 종료될 때 FreeLibrary 또는 AfxFreeLibrary를 사용하여 동적 링크 라이브러리를 해제합니다.
/*
  :     MyDll.dll        ,     lib
*/
#include<windows.h>
#include<stdio.h>
void main(void)
{
//             DLL          
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;//    DLL      
pMax Max;
int a=0;
hDLL=LoadLibrary("MyDll.dll");//       MyDll.dll  ;
Max=(pMax)GetProcAddress(hDLL,"Max");//               
a=Max(5,8);
printf("      %d
",a); FreeLibrary(hDLL);// MyDll.dll ; }

 
참고: 첨부파일 참조!

좋은 웹페이지 즐겨찾기