[독서 노트] 동적 링크 라이브러리
4984 단어 독서 노트
DLL은 Windows 운영 체제와 함께 탄생한 것으로, 오랜 역사와 오랜 시련을 겪어 배울 만하다.물론 이 녀석도 만들었다DLL Hell.(진 호주: DLL Hell - DLL 재난은 마이크로소프트의 DLL이 업그레이드할 때 서로 다른 버전으로 인해 응용 프로그램이 실행되지 못할 수 있는 재난이다. 가장 먼저 COM 프로그래밍을 해야 한다. 일부 목마나 바이러스가 일부 시스템의 DLL을 바꾸면 윈도 전체가 움직이지 않을 수 있다는 것을 모두가 알고 있을 것이다. 이것이 바로 DLL Hell이다).하지만 DLL을 모르는 것이 무섭다는 점도 일깨워 준다.
강력한 Windows API의 모든 함수는 DLL에 포함됩니다.가장 중요한 것은 세 가지가 있다.
정적 라이브러리와 동적 라이브러리에 대해 정적 라이브러리는 포장과 같아서 필요한 모든 것을 exe에 넣고 하나의exe가 천하를 돌아다닌다.동적 라이브러리는 좌우에서 원본으로 실행될 때만 불러옵니다.내가 묘사한 것은 매우 전문적이지 않지만 후자는 매우 총명한 방법이지만 문제가 생기기 쉽다는 것을 알 수 있다.그러나 대부분의 프로그래머들이 유연한 방안을 좋아한다고 믿는다. DLL은 이렇게 유행하기 시작했다. 우리는 어떤 언어를 선택해서 DLL을 작성할 수 있다. 꼭 VC가 아니라 VB일 수도 있다.(마이크로소프트에만 속하는 언어가 이런 권리를 가진 것 같다) 그리고 이것도 고내적 결합과 저결합의 디자인 원칙에 부합된다.물론, 그것은 너의 절차가 매우 비대하지 않을 것을 보장할 것이다.(DLL이 없으면 Windows가 어떻게 될지 상상하기 어렵다).하나의 DLL을 여러 프로세스에서 공유할 수 있기 때문입니다.이상은 뚜렷한 우세입니다.
DLL에서 일부 함수를 내보내려면 함수 앞에 다음을 추가해야 합니다.declspec(dllexport)의 내보내기 표시자입니다.책에서도dumpbin 명령의 사용이 소개되어 디버깅에 도움이 된다.
DLL을 로드하는 방법은 다음과 같습니다.
#include "Dll1.h"
#pragma comment(lib,"Dll1.lib")
그리고 불러올 곳에 상기 코드를 쓰면 됩니다.이것은 스텔스 링크가 dll을 사용하는 일반적인 방식입니다.이런 dll는 어떻게 써야 합니까?
우선 우리는 표지부호를 성명해야 한다:declspec(dllimport).이 물건이 비교적 문명한 방식은 상술한 머리 문서에 쓴 것이다.
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif
그리고 내보내야 할 함수마다 DLL1API면 돼, 이 이름은 스스로 지은 거야.WINDOWS와 같이 여러 가지 강압이 있을 수 있습니다.API.이렇게 하면 우리는 cpp 파일에 다음과 같은 것만 추가할 수 있다.
#define DLL1_API _declspec(dllexport)
#include "Dll1.h"
됐어요.이 물건은 낯익습니까?위에서 말한 내보내기 표시부호가 아닌가..
마지막 책에서 중점적으로 설명한 문제, 즉 이름 개편 문제의 해결 방안.나는 마지막으로def 파일에 의존하는 방식이 비교적 적합하다고 생각한다.이 안에는 두 가지 함수가 있는데, 하나는 일반 함수이고, 다른 하나는 클래스 함수이다.클래스 함수에 대해 다음과 같은 특별한 배려를 해야 한다.
LIBRARY Dll1
EXPORTS
add @1
subtract @2
?output@Point@@QAEXHH@Z @3
?test@Point@@QAEXXZ @4
def 파일에 이 몇 마디를 넣으면 앞과 책이 똑같고 마지막 두 줄이 이렇게 추한 것은 클래스 함수이기 때문이다.다음에 이어지는 @1 같은 것은 사용자 정의 번호입니다.그 두 줄의 추악한 물건은 어떻게 얻었습니까?
VC6에서 settings->Link,Generate mapfile을 표시합니다.컴파일한 후 debug 아래에 하나 있습니다.map 파일, 메모장으로 열고 다음과 같은 문장을 찾습니다.
0001:00000030 ?add@@YAHHH@Z 10001030 f Dll1.obj
0001:00000060 ?subtract@@YAHHH@Z 10001060 f Dll1.obj
0001:00000090 ?output@Point@@QAEXHH@Z 10001090 f Dll1.obj
0001:00000180 ?test@Point@@QAEXXZ 10001180 f Dll1.obj
못생긴 게 어디서 났는지 알 수 있겠지!
다음은 '동적 불러오기 방식' 이라고 하는 디스플레이 불러오기입니다.얘는 어디에 움직일까요?나는 그것이 가볍고 부르는 대로 오는 데 있다고 생각한다.가벼움은 어디에 있습니까?그것은 dll만 필요하고 다른 것은 모두 필요 없다.부르는 대로 오는 것은 필요할 때 dll를 불러오는 것입니다. 필요 없으면 닫을 수 있습니다.
dll을 프로젝트 아래에 놓고 다음과 같은 코드를 써야 합니다.
// dll
HINSTANCE hInst;
hInst = LoadLibrary("Dll3.dll");
//
typedef int (*ADDPROC)(int a,int b);
// dll
/*ADDPROC Add = (ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");*/
ADDPROC Add = (ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
if (!Add)
{
MessageBox(" !");
return;
}
두 가지 함수를 주의해야 한다. 그것이 바로 LoadLibrary(LPCTSTR)이다.및 GetProAddress(HMODULE, LPCSTR);전자는 dll을 가져오고, 후자는 도출 함수를 가져옵니다.매개 변수 1은 전자의 반환값이고, 매개 변수 2는 두 가지 방안이 있다. 주석하는 것은 일반적인 방법으로 함수 이름을 얻는 것이다.여기서 선택한 함수 이름과 위의 추악한 것은 하나의 것임을 알 수 있다. OK. 이것이 바로 함수 이름이다.일치를 유지해야 한다.또한 함수의 번호가 위에서 말한 @1이라는 글자를 알면 MAKEINTRESOURCE 매크로로 변환할 수 있습니다.
이 dll을 더 이상 사용하지 않으면 dll을 풀어야 합니다.다음과 같습니다.
FreeLibrary(hInst);
자, 동적 불러오는 것은 사실 이렇게 많은 내용인데, 사실은 스텔스 링크와 통하는 점이 많다.만약 프로그램에서 dll을 대량으로 사용한다면, 스텔스 링크가 한꺼번에 이루어지는 방안이 당신에게 비교적 적합하지만, 간혹 사용하기만 한다면 (예를 들어 내가 VC6에서 CImage 종류를 사용하고 싶을 때 2008년에 VC6 호출을 위한 dll를 만들었을 때), 디스플레이를 불러오는 것을 추천합니다.
어떻게 선택하느냐는 너의 실제 상황에 달려 있다. 영원히 상하문 프로그래밍에서 벗어나지 마라!
MFC DLL에 대한 내용은 잠깐 보았을 뿐입니다. 어쨌든 MFC라는 오래된 물건은 훗날 반드시 우리를 떠나게 될 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로그'메타프로그램 루비 버전 2'3장 읽기동적 방법 Object#send 호출 방법은 약간 메모와 Object#send obj.send(:my_method, 3) Object#send를 사용하면 어떤 방법으로든 호출할 수 있습니다. privete 방법을 호...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.