VS2008 DLL 생성 및 DLL 호출

5478 단어
스텔스 링크는 프로그램이 실행될 때 DLL 파일을 응용 프로그램에 불러오는 것입니다.암시적 링크에 필요한 파일:lib.
명시적 링크는 응용 프로그램이 실행하는 동안 언제든지 DLL 파일을 로드하거나 DLL 파일을 마운트 해제할 수 있기 때문에 명시적 링크는 해석 언어에 더욱 적합한 유연성을 갖추고 있다.그러나 현식 링크를 실현하는 것은 좀 번거롭다.응용 프로그램에서 LoadLibrary나 MFC가 제공하는 AfxLoadLibrary로 자신이 만든 동적 링크 라이브러리를 현저하게 불러옵니다. 동적 링크 라이브러리의 파일 이름은 상기 두 함수의 매개 변수입니다. 그 다음에 GetProcAddress () 로 도입하고자 하는 함수를 가져옵니다.이로부터 응용 프로그램에서 사용자 정의한 함수처럼 이 도입 함수를 호출할 수 있습니다.프로그램이 종료되기 전에 FreeLibrary 또는 MFC에서 제공하는 AfxFreeLibrary로 동적 링크 라이브러리를 풀어야 합니다.
명시적 링크 응용 프로그램을 사용하여 컴파일할 때는 적절한 Lib 파일을 사용할 필요가 없습니다.또한, GetProcAddress() 함수를 사용할 때, GetProcAddress(hDLL, "Min")를 GetProcAddress(hDLL, "Min")로 변경하는 등 DLLL에 나타나는 함수의 순서 번호를 DLL(hDL, MAKEINTRESOURCE(2)(함수 Min()의 DLL 순서 번호는 2)로 변경하면 DLL에서 함수 호출 속도가 매우 빠르지만, 함수의 사용 순서 번호를 기억해야 하며, 그렇지 않으면 오류가 발생할 수 있다. 
명시적 링크에 필요한 파일: dll.
1. DLL 생성(.def 파일로 동적 연결 라이브러리 생성)
프로젝트 만들기 ->Win32->Win32 프로젝트, 이름: MyDL->DLL 선택
1、새 헤더 파일testdll.h
testdll.h 코드는 다음과 같습니다.
#ifndef TestDll_H_
#define TestDll_H_
#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport) 
#else
#define MYLIBDLL extern "C" _declspec(dllexport) 
#endif
MYLIBDLL int Add(int plus1, int plus2);
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
#endif

2、새 소스 파일testdll.cpp
testdll.cpp 코드는 다음과 같습니다.
#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;
int Add(int plus1, int plus2)
{
int add_result = plus1 + plus2;
return add_result;
}

3. 새 모듈 정의 파일 mydll.def
mydll.def 코드는 다음과 같습니다.
LIBRARY "MyDLL"
EXPORTS
Add @1

4, vs 2008 자동 생성 dllmain.cpp 파일, DLL 애플리케이션의 엔트리 포인트를 정의합니다.
dllmain.cpp 코드는 다음과 같습니다.
4
// dllmain.cpp :    DLL         。
#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;
}
마지막으로 MyDLL을 컴파일합니다.dll 파일 및 MyDLLlib 파일
2. DLL 사용(정적 링크, 암시적 링크)
프로젝트 만들기 -> Win32 콘솔 응용 프로그램, 이름: UseDLL.
MyDLLlib 파일은 UseDLL에 배치됩니다.exe 파일의 디렉터리에 있습니다.
소스 파일 UseDll을 생성합니다.cpp
UseDll.cpp 코드는 다음과 같습니다.
// UseDll.cpp :              。
//
#pragma comment (lib,"MyDLL.lib")
#include "stdafx.h"
#include <iostream>
using namespace std;
extern "C" _declspec(dllimport) int Add(int plus1, int plus2);   //        Setting->Link      MyDll.lib  
int _tmain(int argc, _TCHAR* argv[])
{
int a = 20;
int b = 30;
cout<<"a+b="<<Add(a, b)<<endl;
getchar();
return 0;
}

실행 결과는 다음과 같습니다.
a+b=50
3. DLL 사용(동적 호출, 명시적 링크)
프로젝트 만들기 -> Win32 콘솔 응용 프로그램, 이름: UseDLL.
MyDLLdll 파일을 UseDLL에 배치exe 파일의 디렉터리에 있습니다.
소스 파일 UseDll을 생성합니다.cpp
UseDll.cpp 코드는 다음과 같습니다.
// UseDll.cpp :              。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
typedef int (*AddFunc)(int a,int b);
int _tmain(int argc, _TCHAR* argv[])
{
	HINSTANCE hInstLibrary = LoadLibrary(_T("MyDLL.dll"));//       _T()  。
	if (hInstLibrary == NULL)     
	{     
		FreeLibrary(hInstLibrary);  
		cout<<"LoadLibrary error!"<<endl;
		getchar();
		return 0;
	} 
	AddFunc _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
	if (_AddFunc == NULL) 
	{       
		FreeLibrary(hInstLibrary);  
		cout<<"GetProcAddress error!"<<endl;
		getchar();
		return 0;
	}
	cout <<"a+b="<<_AddFunc(20, 30) << endl;    
	getchar();
	FreeLibrary(hInstLibrary);
	return 0;
}

Cyper의 노트, 2단계 정적 링크는 다음과 같은 오류 1>--------Build started: Project:testdll,Configuration:Debug Win32------
1>Linking...
1>testdll.obj : error LNK2019: unresolved external symbol __imp__Add referenced in function _wmain
1>C:\f\vsProject\Vc9.0\testdll\Debug\testdll.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\f\vsProject\Vc9.0\testdll\testdll\Debug\BuildLog.htm"
1>testdll - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
해결 방법:
4
// UseDll.cpp :              。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#pragma comment (lib,"MyDLL.lib")
extern "C" _declspec(dllimport) int Add(int plus1, int plus2);   //        Setting->Link      MyDll.lib  
int _tmain(int argc, _TCHAR* argv[])
{
	int a = 20;
	int b = 30;
	cout<<"a+b="<<Add(a, b)<<endl;
	getchar();
	return 0;
}
#prama 줄을 stdafx로 옮깁니다.h다음은 틀림없다
)

좋은 웹페이지 즐겨찾기