DLL 사용 방법
DLL 사용 방법
전재하다
yibansha0
최종 편집
yibansha0
DLL을 호출하려면 정적 및 동적 두 가지 방법이 있습니다.(1).정적 호출 절차는 다음과 같다.너의 you App.DLL을 대상 프로젝트 (you App. DLL을 호출해야 하는 프로젝트) 의 Debug 디렉터리에 복사하기;2. 너의 you App.lib을 대상 프로젝트 (you App.DLL을 호출해야 하는 프로젝트) 디렉터리에 복사하기;3. 너의 you App.h (출력 함수 정의 포함) 대상 프로젝트 (you App.DLL을 호출해야 하는 프로젝트) 디렉터리에 복사하기;4. 목표 프로젝트 선택 프로젝트를 열고 Visual C++ 프로젝트 메인 메뉴의 Settings 메뉴를 선택하십시오.5. 4단계를 수행하면 VC에서 여러 페이지 표시 컨트롤에서 Link 페이지를 선택하는 대화 상자가 나타납니다.그런 다음 Object/library modules 입력 상자에 you App. 를 입력합니다.lib 6.대상 프로젝트를 선택하십시오 Head Files 가입: you App.h 파일7. 마지막으로 목표 프로젝트(*.cpp, DLL의 함수를 호출해야 함)에 당신을 포함합니다. #include "you App.h"주석: you App는 당신의 DLL 프로젝트 이름입니다.2. 동적 호출 프로그램은 다음과 같다. 동적 호출 시 정적 호출 절차만 하면 된다.{HINSTANCE hDLInst = LoadLibrary('you App.DLL'), if(hDllInst) {typedef DWORD(WINAPI * MYFFFURD·DWORD); MYFUNC youFUNC YYYFUNC youFUNC youFUNC youFuntionNameAlias = NULLLLL;NNIIIIIIIIIA), NYYYYFFFFF(hDLLLLLLL'), YYYYYYYYYYYYYYYYHHHHHHHINSTANCE DLLLLLLLLLLLL(youFuntionNameAlias) {youFuntionNameAlias(param1,param2);FreeLibrary(hDllInst); } }
출처:
codeguru
나는 DLLs를 공부하고 있는데 그에 대해 어떤 높은 지붕을 쌓았다는 견해를 말할 수 없다.이 글은 단지 인코딩을 통해 코드가 어떻게 작동하는지 보여주고 알고 싶을 뿐이다.본고에서, 나는 네가 디렉터리 경로를 설정하는 등 너의 컴파일러 특성을 어떻게 사용하는지 알고 있다고 가정한다.
프로젝트를 설정하려면 Win32 콘솔 프로젝트(Win32 Console Application)를 선택하고 프로그램 설정 탭(the advanced tab)에서 DLL 및 빈 항목 옵션을 선택합니다.DLLs는 아마도 네가 상상한 것처럼 그렇게 어렵지 않을 것이다.우선 헤더 파일 쓰기 (header file);DLLtutorial이라고 합니다.h.이 파일은 다른 헤더 파일과 마찬가지로, 그 중 일부 함수의 원형일 뿐이다.
#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream>
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
extern "C"
{
DECLDIR int Add( int a, int b );
DECLDIR void Function( void );
}
#endif
앞의 두 줄 지시 컴파일러는 이 파일을 한 번만 포함합니다.extern "C"는 컴파일러에게 이 부분을 C/C++에서 사용할 수 있음을 알려 줍니다.
VC++에서는 함수를 내보내는 두 가지 방법이 있습니다.
1. 사용declspec, Microsoft 정의 키워드
2. 모듈 정의 파일(Module-Definition File 즉.DEF)을 생성합니다.첫 번째 방법은 두 번째 방법보다 조금 간단하지만, 두 가지 모두 일을 잘한다.
__declspec (dllexport) 는 DLL의 메모리 클래스에 함수 기호를 내보냅니다.다음 줄이 정의되었을 때 이 함수를 실행하기 위해 DECLDIR를 정의합니다.
#define DLL_EXPORT
함수 가져오기
#define DLL_EXPORT
원본 파일에 나타나지 않았습니다.이 경우 함수 Add (int a, int b) 와 Function () 을 내보냅니다.
이제 DLLtutorial이라고 부를 것을 써야 합니다.cpp의 원본 파일입니다.
#include <iostream>
#include "DLL_Tutorial.h"
#define DLL_EXPORT
extern "C"
{
DECLDIR int Add( int a, int b )
{
return( a + b );
}
DECLDIR void Function( void )
{
std::cout << "DLL Called!" << std::endl;
}
}
여기에 모든 함수를 정의했습니다.Int Add (int a, int b) 는 두 개의 수를 간단하게 더하고 void Function (void) 은 DLL이 호출될 때만 알려 줍니다.DLL을 어떻게 사용하는지 보여주기 전에 모듈 정의 파일 (.def) 에 대한 내용을 알려드리고 싶습니다.
모듈 정의 파일(.def)
모듈 정의 파일은 있습니다.def 파일 확장자의 텍스트 파일입니다.DLL 내보내기 함수 및declspec(dllexport)은 비슷하지만.def 파일은 Microsoft에서 정의한 것이 아닙니다.하나def 파일에는 두 가지 필수 부분만 있습니다: LIBRARY와 EXPORTS.우리 먼저 기본적인 것을 봅시다.def 파일은 잠시 후에 분석할 것입니다.
LIBRARY dll_tutorial
DESCRIPTION "our simple DLL"
EXPORTS
Add @1
Function @2
첫 번째 행은'LIBRARY'가 필요합니다.이것은 링크기 (linker) 가 DLL을 어떻게 명명하는지 알려 줍니다.아래에'DESCRIPTION'이라고 표시된 부분은 꼭 필요한 것은 아니지만, 나는 그것을 넣는 것을 좋아한다.이 문장은 문자열을 쓴다.rdata 섹션 [MSDN에 따르면]은 누가 이 DLL을 사용할 수 있는지, 이 DLL이 무엇을 할 수 있는지, 무엇을 위해 존재하는지 알려준다.그리고 다음 부분은'EXPORTS'로 표시하는 것이 또 다른 필수적인 부분이다.이 부분에서 이 함수를 다른 프로그램에 접근할 수 있고 가져오기 라이브러리를 만들 수 있습니다.당신이 이 프로젝트를 생성할 때, 단지 하나의 것이 아니다.dll 파일이 생성되었고 파일 확장자가.lib의 내보내기 라이브러리도 생성되었습니다.앞부분을 제외하고 여기에는 NAME, STACKSIZE, SECTIONS,VERSION이라는 네 가지 부분이 있다.나는 더 이상 이 내용과 관련되지 않을 것이다. 그러나 만약 당신이 인터넷에서 검색한다면, 나는 당신이 몇 가지 물건을 찾을 것이라고 생각한다. (역주: MSDN 2003에서 템플릿 정의 파일의 각 부분에 대해 상세하게 설명한 것은 참고하십시오.)또한 하나의 세미콜론(;)'//' 가 C++에 있는 것처럼 주석을 시작합니다.
현재 DLL을 만들었으니 프로그램에서 사용하는 법을 배워야 합니다.이 DLL이 생성되면 생성됩니다.dll 파일과 하나.lib 파일이 두 개는 모두 네가 필요로 하는 것이다.
암시적 링크
DLL을 로드하는 두 가지 방법이 있습니다.한 방법은 지름길이고 다른 한 방법은 비교적 복잡하다.지름길은 너에게만 연결되는 것이다.lib 파일 및.dll 파일을 새 프로젝트의 경로에 넣습니다.따라서 빈 Win32 콘솔 항목을 새로 만들고 소스 파일을 추가합니다.새 프로젝트와 같은 디렉터리에 DLL을 넣으십시오.
#include <iostream>
#include <DLLTutorial.h>
int main()
{
Function();
std::cout << Add(32, 58) << "
";
return(1);
}
DLLtutorial에 연결해야 합니다.lib 파일프로젝트 등록 정보에 설정되어 있지만 다음 문구로 대체할 수 있습니다.
#pragma comment(lib, "DLLTutorial.lib")
DLL 폴더를 보려면 컴파일러에 문의하십시오.lib 파일은 이 디렉터리의 DLL 헤더 파일도 볼 수 있도록 합니다.만약 당신이 이렇게 하고 싶지 않다면, 당신은 항상 그들을 새 프로젝트의 디렉터리에 넣고 < > 대신 "(인용부호)"를 사용할 수 있습니다.이것이 바로 DLL을 로드하는 간단한 방법입니다.
링크 표시
어려운 DLL 로드 방법은 조금 복잡합니다.함수 포인터와 Windows 함수가 필요할 것입니다.그러나, 이런 DLLs를 불러오는 방법을 통해, 너는 DLL을 필요로 하지 않는다.lib 또는 헤더 파일 대신 DLL만 필요합니다.아래에 몇 가지 코드가 열거되어 있는데, 내가 잠시 후에 그것을 해석할 것이다.
#include <iostream>
#include <windows.h>
typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
int main()
{
AddFunc _AddFunc;
FunctionFunc _FunctionFunc;
HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);
}
std::cout << _AddFunc(23, 43) << std::endl;
_FunctionFunc();
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
우선 '윈도우즈. h' 파일을 포함하고 'DLL Tutorial.h' 를 옮겼음을 알 수 있습니다.이유는 간단하다. 윈도우즈 때문에.h는 일부 Windows 함수를 포함하고 있습니다. 물론 몇 개만 있으면 됩니다.또한 사용할 Windows 특정 변수도 포함되어 있습니다.DLL의 헤더 파일 (DLL Tutorial.h) 을 지울 수 있습니다. 앞에서 말했듯이, DLL을 불러올 때 필요하지 않기 때문입니다.
다음은 다음과 같은 형태의 작은 괴상한 코드를 볼 수 있습니다.
typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
이것은 함수 바늘이다.이것은 DLL에 관한 자습 지침이기 때문에 함수 탐구 지침은 본 지침의 범위를 넘어섰다.따라서 이제 DLL에 포함된 함수의 별칭으로만 사용합니다.나는 끝부분에서'Func'로 이름을 짓는 것을 좋아한다.(int, int) 부분은 이 함수의 매개 변수 부분이다. 예를 들어 Add 함수는 두 개의 정수를 얻어야 한다.따라서 함수 바늘로 사용할 인자가 필요합니다.Function 함수에는 매개변수가 없으므로 빈 상태로 둡니다.main () 부분의 앞의 두 줄은 DLL 내부의 함수와 같다고 생각할 수 있도록 함수 포인터입니다.나는 단지 그것들을 미리 정의하는 것을 좋아할 뿐이다.
HINSTANCE는 Windows 데이터 형식입니다. 실례적인 핸들입니다.이 경우 이 인스턴스는 이 DLL이 됩니다.DLL 인스턴스는 함수 LoadLibrary()를 사용하여 매개변수로 사용할 수 있습니다.LoadLibrary 함수를 호출한 후 함수 반환이 성공했는지 확인해야 합니다.HINSTANCE가 NULL과 같은지 (Windows.h에서 0 또는 Windows.h로 정의된 헤더 파일) 를 검사해서 성공했는지 확인할 수 있습니다.NULL과 같으면, 이 핸들은 무효이며, 이 라이브러리를 풀어야 합니다.다시 말하면, DLL에서 얻은 메모리를 풀어야 한다.함수가 성공적으로 반환되면 HINSTANCE에는 DLL을 가리키는 핸들이 포함됩니다.
DLL을 가리키는 핸들을 얻으면 DLL에서 함수를 다시 얻을 수 있습니다.이렇게 하려면 DLL의 핸들 (HINSTANCE를 사용할 수 있음) 과 함수의 이름을 매개 변수로 하는 함수GetProcAddress () 를 사용해야 합니다.GetProcAddress () 에서 되돌아오는 값을 함수 포인터로 가져올 수 있으며, 그 함수에 정의된 함수 포인터로 변환해야 합니다.예를 들어 Add () 함수에 대해 GetProcAddress () 를 AddFunc로 변환해야 합니다.이것이 바로 그것이 매개 변수와 반환 값을 아는 원인이다.이제 함수 포인터가 NULL과 같은지, DLL을 가진 함수인지 확인하는 것이 좋습니다.이것은 간단한if문장일 뿐이다.둘 중 하나가 NULL과 같으면 앞서 설명한 대로 라이브러리를 풀어야 합니다.
일단 함수 바늘이 DLL의 함수를 가지고 있다면, 너는 지금 그것들을 사용할 수 있지만, 여기에 주의해야 할 점이 하나 있다. 함수의 실제 이름을 사용할 수 없다.너는 그것들을 호출하기 위해 함수 바늘을 사용해야 한다.그 이후로 네가 해야 할 일은 창고를 풀어주는 것뿐이야.
이제 DLL의 몇 가지 기본 지식을 알게 되었다.너는 그것들을 어떻게 만드는지 알고, 너도 어떻게 두 가지 다른 방법으로 그것들을 연결하는지 안다.여기에는 여전히 우리가 배워야 할 것이 더 많지만, 나는 그것들을 너희들 스스로 탐색하고 더 훌륭한 작가에게 남겨 두었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.