dll 예제

모듈 정의 파일을 사용하여 내보낸 DLL 함수를 선언할 수도 있습니다. 모듈 정의 파일을 사용하는 경우 내보낸 DLL 함수에 함수 키워드를 추가할 필요가 없습니다. 모듈 정의 파일에서 라이브러리 문 및 DLL에 대 한 내보내기 문을 선언 합니다. 다음 코드는 정의 파일의 예입니다. 다음 코드는 Win32 동적 링크 라이브러리 프로젝트 유형을 사용하여 Visual C++에서 만든 DLL의 예입니다. 마법사가 완료되면 최소한의 콘솔 응용 프로그램 프로젝트가 만들어집니다. 주 소스 파일의 이름은 이전에 입력한 프로젝트 이름과 같습니다. 이 예제에서는 MathClient.cpp라는 이름이 붙여진 것입니다. 빌드할 수 있지만 아직 DLL을 사용하지 않습니다. 또한 응용 프로그램이 다중 스레드인 경우 TLS(스레드 로컬 저장소)를 사용하여 진입점 함수의 각 스레드에 개인인 메모리를 할당할 수 있습니다. 다음 코드는 DLL 진입점 함수의 예입니다. DLL 또는 동적 링크 라이브러리를 하나의 파일로 함께 압축된 코드, 데이터 또는 리소스의 모음으로 간단히 생각할 수 있습니다. DLL은 코드를 배포하고 재사용할 수 있는 좋은 방법입니다.

예를 들어 각 응용 프로그램에서 동일한 작업을 코딩하는 대신 추가, 빼기, 곱셈 및 나누기와 같은 산술 연산을 사용하는 두 개의 응용 프로그램이 있는 경우 이러한 작업을 DLL(예: Math.dll) 내에 넣을 수 있습니다. 두 응용 프로그램에서 DLL을 참조합니다. 이러한 방식으로 수학 연산을 한 번만 코딩하는 반면 두 응용 프로그램 또는 향후 응용 프로그램은 산술 연산에 동일한 Math.dll을 사용할 수 있습니다. 다음 예제는 언어별 Windows API 바인딩을 사용하여 런타임 로드 및 연결 시설을 사용하는 방법을 보여 주며, 이 예제는 다음과 같은 설명입니다. 파일 맨 위에 있는 전처리기 문을 확인합니다. 기본적으로 DLL에 대한 새 프로젝트 템플릿은 DLL 프로젝트에 대해 정의된 전처리기 매크로에 PROJECTNAME_EXPORTS를 추가합니다. 이 예제에서 Visual Studio는 MathLIBRARY DLL 프로젝트를 빌드할 때 MATHLIBRARY_EXPORTS를 정의합니다. 다음 예제에서는 언어별 바인딩을 사용하여 컴파일 타임에 DLL에 대해 연결하기 위한 기호를 가져오는 방법을 보여 주습니다.

Dlls가 코드에서 로드되기 때문에 대신 정적 라이브러리를 사용하는 것 같아요(예 : Win32에서는 LoadLibrary()를 사용해야 합니다. 진입점 함수는 간단한 초기화 작업만 수행해야 하며 다른 DLL 로드 또는 종료 함수를 호출해서는 안 됩니다. 예를 들어 진입점 함수에서 LoadLibrary 함수 또는 LoadLibraryEx 함수를 직접 또는 간접적으로 호출해서는 안 됩니다. 또한 프로세스가 종료될 때 FreeLibrary 함수를 호출해서는 안 됩니다. 정적 라이브러리와 마찬가지로 DLL에 대한 가져오기 라이브러리는 .lib 파일 확장명으로 표시됩니다. 예를 들어 파일 생성 및 메모리 관리와 같은 Windows 기본 기능에 대한 기본 동적 라이브러리인 kernel32.dll은 kernel32.lib를 통해 연결됩니다. MATHLIBRARY_EXPORTS 매크로가 정의되면 MATHLIBRARY_API 매크로는 함수 선언에 __declspec(dllexport) 수정자를 설정합니다. 이 수정자는 컴파일러와 링커에게 DLL에서 함수 또는 변수를 내보내 다른 응용 프로그램에서 사용할 수 있도록 지시합니다. 예를 들어, MATHLIBRARY_EXPORTS가 정의되지 않은 경우, 예를 들어 헤더 파일이 클라이언트 응용 프로그램에 포함되는 경우 MATHLIBRARY_API는 선언에 __declspec(dllimport) 수정자를 적용합니다. 이 수정자는 응용 프로그램에서 함수 또는 변수 가져오기를 최적화합니다. 자세한 내용은 dllexport, dllimport를 참조하십시오. 코드 섹션과 달리 DLL의 데이터 섹션은 일반적으로 비공개입니다.

즉, DLL을 사용하는 각 프로세스에는 모든 DLL 데이터의 자체 복사본이 있습니다. 선택적으로 데이터 섹션을 공유할 수 있으므로 이 공유 메모리 영역을 통해 프로세스 간 통신이 가능합니다. 그러나 사용자 제한은 공유 DLL 메모리 사용에 적용되지 않으므로 보안 허점이 발생합니다. 즉, 하나의 프로세스가 공유 데이터를 손상시킬 수 있으며, 이로 인해 다른 모든 공유 프로세스가 원치 않게 동작할 수 있습니다.