컴퓨터 지식 네트워크 - 컴퓨터 프로그래밍 - 비주얼 c++동적 링크 라이브러리 패키징 정보

비주얼 c++동적 링크 라이브러리 패키징 정보

아마도 이 문장 다 보고 나면 너는 알게 될 것이다.

Windows 세계에서는 활발한 대륙이 무수히 많은데, 그것들은 모두 같은 이름인 동적 링크 라이브러리를 가지고 있다. 지금 이 신기하고 활발한 대륙으로 들어가, 그들이 오랫동안 숨겨온 비밀을 찾아내자!

문 엿볼: 창문의 초석

시스템 디렉토리를 열면 확장자가 DLL 인 많은 파일을 한 눈에 볼 수 있습니다. 이를 "동적 링크 라이브러리" 라고 하며 DLL 은 동적 링크 라이브러리의 약어입니다. Microsoft 가 Windows 의 첫 번째 버전을 출시한 이래로 동적 링크 라이브러리는 이 운영 체제의 기초가 되었습니다.

1. DLL 의 내용을 봅니다.

난해한 기술 용어로 DLL 이 무엇인지 해결하기 보다는 먼저 DLL 에 무엇이 있는지 살펴보겠습니다. DLL 은 EXE 파일과 마찬가지로 프로그램의 이진 실행 코드와 프로그램에 필요한 리소스 (예: 아이콘, 대화상자, 문자열 등) 를 포함합니다. ), 그런데 왜 코드를 EXE 가 아닌 DLL 에 넣어야 하나요? 실제로 DLL 의 코드는 API 함수로 나타납니다. 일반적으로 DLL 에 포함된 프로그램 코드를 작은 모듈로 만들면 응용 프로그램은 DLL 의 특정 버튼을 눌러 DLL 의 이 버튼이 나타내는 함수를 호출합니다. 메모장과 같은 프로그램을 사용할 때 파일을 저장하거나 열려고 하면 일반 파일 대화상자가 팝업되어 파일 위치를 선택합니다. 이것은 시스템의 기본 DLL 에서 범용 대화 상자 인터페이스를 호출하는 것입니다.

2. 시스템의 몇 가지 중요한 dll.

Windows 에는 kernel32.dll, User32.dll, GDI32.dll 등 세 가지 매우 중요한 기본 dll 이 있습니다. 이름에서 알 수 있듯이 Kernel32.dll 은 메모리, 프로세스 및 스레드를 관리하는 함수를 포함하는 커널 관련 함수입니다. User32.dll 에는 사용자 인터페이스 작업을 수행하는 함수가 포함되어 있습니다. 예를 들어, 사용자의 마우스 클릭 동작을 창에 전달하여 창이 사용자의 클릭에 따라 예정된 이벤트를 수행할 수 있도록 합니다. GDI32.dll 의 약어인 Graphical Device Interface 에는 텍스트를 그리고 표시하는 함수가 포함되어 있습니다. 예를 들어 프로그램 창을 표시하려면 함수 중 하나를 호출하여 창을 그립니다.

3. 왜 DLL 을 사용해야 합니까?

방금 이 문제를 말했을 때, 나는 단지 DLL 이 프로그램 코드를 함수로 캡슐화하는 원리를 설명했을 뿐이다. 캡슐화가 하나의 함수로 시스템에서 dll 을 대량으로 사용하는 이유가 될 수 있는 이유는 무엇입니까?

① 응용 프로그램 확장

DLL 은 응용 프로그램에 의해 메모리에 동적으로 로드될 수 있기 때문입니다. 따라서 응용 프로그램은 필요한 경우 DLL 을 메모리에 로드할 수 있으므로 프로그램 서비스 용이성이 높습니다. 예를 들어 QQ 의 비디오 기능을 업그레이드해야 하는 경우 QQ 를 작성하는 프로그래머는 QQ 의 모든 코드를 다시 작성할 필요 없이 비디오 기능과 관련된 DLL 파일만 다시 작성하면 됩니다.

② 프로그래머의 협력을 용이하게한다.

이것은 최종 사용자와 관계가 크지 않고, 단지 이해하기 위해서이다. VB, VC, 델파이 등과 같은 많은 프로그래밍 도구가 있다는 것을 모두 알고 있습니다. 만약 몇 사람이 합작하여 큰 프로그램을 작성한다면, 어떤 사람은 VB 를 사용하고, 어떤 사람은 VC 를 사용하며, 사람마다 사용하는 프로그래밍 언어는 다르다. 어떤 컴파일러에서 컴파일해야 합니까? 다른 나라의 한 무리의 사람들이 동시에 문장 한 편을 쓰는 것과 같다. 만약 모두 다른 언어를 사용한다면, 문장 들은 어떻게 함께 쓰나요? DLL 을 사용하면 VC 프로그래머가 DLL 을 쓸 수 있으며, VB 프로그래머는 별도의 EXE 로 컴파일하는 방법에 대해 걱정하지 않고 프로그램에서 호출할 수 있습니다.

③ 메모리를 절약한다.

여러 응용 프로그램이 동일한 동적 링크 라이브러리를 호출하는 경우 DLL 파일은 메모리에 반복적으로 로드되지 않지만 이러한 응용 프로그램은 메모리에 로드된 동일한 DLL 을 공유합니다. 예를 들어, 사무실에서는 모든 직원에게 정수기를 갖추는 일이 거의 없습니다. 공공 장소에 정수기를 두는 것이다. 물을 마셔야 하는 모든 직원들이 이 정수기를 이용할 수 있어 비용을 절감하고 공간을 절약할 수 있다.

(4) * * * 프로그램 자원 활용

앞서 언급한 공통 파일 대화상자를 포함합니다. DLL 파일은 응용 프로그램 간에 리소스를 공유할 수 있는 가능성을 제공합니다. 리소스는 프로그램 대화 상자, 문자열, 아이콘 또는 사운드 파일일 수 있습니다.

⑤ 응용 프로그램 현지화 문제를 해결하십시오.

프로그램의 현지화 패키지를 다운로드한 후 프로그램의 원래 DLL 이 다운로드 패키지의 DLL 파일로 덮어쓰여져 로컬라이제이션이 완료되는 것을 종종 볼 수 있습니다. 이러한 프로그램은 실행 코드와 응용 프로그램 인터페이스를 별도로 작성하며, 한화기는 프로그램 인터페이스와 관련된 DLL 만 한화하고 게시하면 됩니다.

지식에 대한 갈망: DLL 의 진실을 탐구하십시오

DLL 에 얼마나 많은 함수가 있는지, EXE 가 어떤 DLL 의 어떤 함수를 호출했는지 누가 압니까? 사실 이 문제는 결코 해결하기 어렵지 않다. Dependency Walker (이하 Dependencies, 다운로드 클릭 Dependency Walker) 는 EXE 파일을 분석하는 도구로서 오늘날 DLL 의 진실을 탐구하는 도구입니다.

1. DLL 에 있는 함수 수를 확인합니다.

1 단계: 다운로드 압축 해제 Depends, 안에 있는 depends.exe 를 실행한 다음' 파일 → 열기' 메뉴를 선택합니다. 파일 선택 상자에서 분석할 DLL 파일을 선택하여 엽니다. 여기에서 QQ 디렉터리에서 QQZip.dll 을 선택합니다.

두 번째 단계: 프로그램 왼쪽의 트리 열에는 다른 DLL 의 함수 (다른 DLL 도 원래 DLL 에서 호출할 수 있음) 가 나열되고 오른쪽의 두 열 목록에는 각각 함수 입력 및 출력 테이블이 표시됩니다. 함수 출력 테이블은 이 DLL 이 다른 exe 또는 DLL 에 제공하는 함수의 총 목록입니다.

3 단계: 함수 출력 테이블의 함수 열은 출력 함수의 이름이며 QQZip.dll 에서 UnZip 과 Zip 이라는 두 가지 함수를 찾습니다. 따라서 QQ 프로그램에서 압축 및 압축을 담당하는 것은 DLL 이라고 판단할 수 있습니다.

EXE 를 확인하는 데 사용되는 DLL 은 무엇입니까?

QQ 를 예로 들어 종속성에서 QQ.exe 를 엽니다. 이제 인터페이스 왼쪽의 트리 목록에 QQ.exe 가 호출하는 dll 목록이 표시됩니다. 이러한 DLL 분기를 확장하면 다른 DLL 을 찾을 수 있습니다. 즉, QQ 가 호출하는 이러한 DLL 파일이 다른 DLL 을 호출할 수 있습니다 (거의 긍정). 그것은 새로운 DVD 플레이어를 구입 같은 거 야. 안에 쓰이는 심지는 소니일 수도 있고, 이 심지에 있는 작은 콘덴서는 다른 회사일 수도 있다. 이것은 같은 이치이다.

DLL 로 EXE 의 진면목을 간파하다

방금 QQ.exe 에서 사용한 dll 목록을 받았습니다. 사실 이 목록을 통해 다른 많은 정보를 분석할 수 있다. 예를 들어 MFC42.dll 을 포함하면 QQ.exe 가 VC (Visual C++) 로 작성되었으며 WSOCK32.dll 을 포함하면 이 프로그램에 네트워크 통신 기능이 있음을 알 수 있습니다. 다음은 간단한 표입니다. 다른 exe 를 분석할 때 사용하는 DLL 에 따라 해당 기능에 대한 예비 판단을 내릴 수 있습니다.

DLL 파일 이름으로 판단할 수 있는 EXE 정보

MFC42.dll 은 VC5.0/6.0 으로 작성되었습니다.

Vbrun *. Dll "*" 는 숫자 버전 번호를 나타내며 VB3.0/4.0 으로 작성되었습니다.

MSVBVM50.DLL 은 VB5.0 으로 작성되었으며 Windows 98(SE) 에 dll 이 포함되어 있습니다.

MSVBVM60.dll 은 VB6.0 으로 작성되었으며 Windows Me/2000/XP 와 같은 시스템에 있습니다.

ADVAPI32.dll 은 등록 작업을 수행할 수 있습니다.

WSOCK32.dll 에는 네트워크 통신 기능이 있습니다.

WS2_32.dll 에는 네트워크 통신 기능이 있습니다.

WININET.dll 에는 브라우저 및 다운로드 도구와 같은 HTTP 탐색 및 다운로드 기능이 있습니다.

WINMM.dll 에는 멀티미디어를 재생할 수 있는 기능이 있습니다.

DDRAW.dll 게임, 고급 이미지 처리 도구.

D3D*. Dll 3D 게임 또는 애니메이션 도구.

4.DLL 은 위대한 보물 창고입니다.

응용 프로그램이 함수를 호출하는 DLL 외에도 QQ 디렉토리의 QQRes.dll 과 같은 리소스를 절약하는 또 다른 DLL 이 있습니다. Depends 로 열어보니 출력 기능이 없습니다. 닭갈비 DLL 인가요? 그러나 자원 도구 Resource Hacker (다운로드 주소: /soft/ 12420.htm) 로 이 DLL 을 연 후 아이콘, 음악, 사진, 문자열, 문자열 등 QQ 리소스가 많이 저장되어 있는 것을 발견했다 ...

끝까지 캐묻다: DLL 의 이야기

DLL 로 인한 장애는 매우 일반적입니다. 왜 고장을 일으키는가? 문제를 어떻게 해결합니까? 쉿 ~ DLL 의 대화를 엿들으면 알 수 있다.

1. 포터에서 인터페이스 호환성에 대해 이야기하십시오.

Windows 사이트에는 EXE 라는 하청업체가 있는데, 그 밑에는 DLL 이라는 시공사가 많다. 그 중 한 명은 시멘트 처리를 전담하는 DLL (당분간은' Porter A' 라고 불림) 이 있다. 계약자인 EXE 가 시멘트를 운반해야 할 때마다 그에게 "자! 움직이다. "

시간이 지나면서 운반공 A 는 자신의 효율성이 너무 낮다고 느끼며 매번 1 시멘트 봉지에서 시멘트 세 봉지를 옮기는 것으로 바뀌었다. 처리 방법을 개선한 후에도 EXE 계약자는 여전히 "자! 움직이다. " 하지만 포터 A 가 그의 처리 방식을 바꿨는지 모르겠다.

하지만 시간이 지나자 계약자 EXE 는 Porter A 를 해고하고 다른 공사장에서 또 다른 DLL (일시적으로 Porter B 라고 함) 을 찾았다. 이 운반공이 다른 공사장에 있을 때, 물건을 옮기는 것이 빠르기 때문에, 하청업체 EXE 는 운반 작업을 "업그레이드" 하기로 결정했다. 하지만 제가 정말로 일을 시작했을 때, 계약자가 뭔가 잘못되었다는 것을 알게 되었습니다. 자, 제가 몇 번을 외쳐도 "자! 움직이다. " 이 새 운반공 B 는 아무것도 옮기는 것조차 모른다.

위의 예에서 Porter A 는 처리 방법을 개선했지만 EXE 가 호출하는 메서드는 변경되지 않았습니다. 이는 DLL 업그레이드의 원리로 내부 구현 방법이 향상되지만 호출 인터페이스는 변경되지 않으므로 EXE 파일이 업그레이드 없이 새 버전의 DLL 을 호출할 수 있습니다. 포터 B 의 이야기는 새 버전의 DLL 이 얼마나 효율적이든 간에 인터페이스 (DLL 에서 출력되는 함수 이름으로 해석될 수 있음) 가 원본과 일치하지 않으면 EXE 가 알지 못하거나 호출할 수 없다는 것을 보여준다.

2. 등록 신분증에 대한 동적 링크 라이브러리

시스템 장애 중 상당수는 등록되지 않은 DLL 파일로 인해 발생합니다. 예를 들어 Windows XP 의 압축 폴더 기능이 실패하면 시스템 디렉토리에 있는 zipfldr.dll 이 등록되지 않았을 가능성이 높습니다. 이 장애 해결 방법은 일반적으로 다음 명령을 실행하는 것입니다.

Regsvr32 DLL 파일 이름

많은 사람들이 우리가 왜 이렇게 하는지 이해하지 못한다. 모든 dll 이 이렇게 할 수 있습니까?

실제로 시스템에 있는 dll 은 두 가지가 있습니다. 하나는 등록 없이 사용할 수 있고, 다른 하나는 시스템 로그인 (등록) 후에 사용할 수 있습니다. 직원 명단에 있는 임시직과 장기 계약직의 차이와 같다. 이 두 dll 을 어떻게 구분할 수 있습니까? 방법은 매우 간단하다. 방금 Depends 로 이 DLL 을 열고 함수 출력표도 보세요. 다음 두 가지 함수 (등록된 DLL 과 등록되지 않은 DLL) 가 포함되어 있는 경우 사용할 DLL 을 등록해야 합니다.

DllRegisterServer

DllUnregisterServer

Regsvr32 명령은 실제로 DLL 에서 두 함수를 모두 호출합니다 ("regsvr32 /u DLL 파일 이름" 은 DllUnregisterServer 등록 해제 함수를 호출합니다).

플러그인 DLL 의 비밀

Winamp, Foobar 2000 등 많은 소프트웨어에는 플러그인 기능이 있습니다. 인터넷에서 DLL 을 다운로드하여 플러그인 디렉토리에 배치하면 프로그램이 새로운 기능을 지원할 수 있습니다. 어떻게 그렇게 할 수 있을까요? 인기 있는 재생 소프트웨어인' 수천 개의 노래 듣기' 를 예로 들어 보겠습니다.

수천 개의 청취용 플러그인 디렉토리는 일반적으로 "플러그인" 및 "Addin" 으로 이름이 지정된 소프트웨어 설치 디렉토리의 Addin 하위 디렉토리에 있습니다. 수천 개의 노래 듣기 플러그인 디렉토리에는 tt_asf.dll, tt_rm.dll 등과 같은 많은 DLL 파일이 있습니다. 파일 이름에서 알 수 있듯이, 이 dll 은 이 플레이어가 다양한 유형의 오디오 파일을 지원할 수 있도록 하는 데 사용됩니다. 마찬가지로, Depends 로 이 파일들을 열면, 이 파일들의 출력 함수 테이블에 모두 같은 함수인 ttpGetSoundAddIn 이 포함되어 있다는 것을 알 수 있다. (토마스 A. 에디슨, Northern Exposure (미국 TV 드라마), 성공명언)

수천 개의 수신 플러그인 프로토콜.

이것이 바로 플러그인의 비밀이다. 플러그인 함수를 지원하는 다양한 프로그램은 프로그램이 호출할 플러그인 DLL 에 포함되어야 하는 함수 이름 및 관련 매개변수 규칙을 지정하는 플러그인 프로토콜을 게시할 때 동시에 게시합니다. 그런 다음 이 프로그램의 플러그인을 작성할 때 타사 플러그인 프로그래머는 이 플러그인의 표준에 따라 DLL 의 출력 함수를 작성합니다.

① 플러그인 tt_asf.dll 의 경우

Ttplayer.exe ('천청' 마스터 프로그램) 는 tt_asf.dll 에게 "당신의 ttpGetSoundAddIn 함수를 호출할게요!" 라고 말했다

Tt_asf.dll 이 대답했습니다. "좋습니다."

(2) 관련 없는 DLL 을 AddIn 디렉토리에 넣으면.

Ttplayer.exe 는 알 수 없는 DLL 에게 "당신의 ttpGetSoundAddIn 함수를 호출할게요!" 라고 말했다 ""

Tt_asf.dll 이 대답했다: "그 함수는 무엇입니까? 못 들었어! "

上篇: 불강금텐투자유한공사는 어떠세요? 下篇: 광학 잠금 해제 1-1장 상세 가이드
관련 내용