VS2008 DLL 생성 및 DLL 호출
명시적 링크는 응용 프로그램이 실행하는 동안 언제든지 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다음은 틀림없다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.