먼저 등 제 3 자 플러그인을 지원 당신이 GetModuleHandle 및 LoadLibrary 정확히 동일하지 것으로 알고 있습니다 있는지 확인하려면
에서 LoadLibrary도 유용하다. 그러나 이것이 당신의 질문에 직접적으로 포함되지는 않기 때문에 큰 설명을 생략하고 두 링크의 문서를 확실히 이해할 것을 제안합니다.
dll 함수를 다른 함수처럼 직접 사용하려면 헤더 만 포함하면 안됩니다. 헤더 외에도 프로젝트의 어딘가에 해당 lib 파일과 연결하라는 메시지가 전달됩니다. 귀하의 예제에서는 kernel32.lib가됩니다. 이 작업은 프로젝트의 링커 설정 또는 파일에 #pragma comment (lib, ...)
이있는 것과 같은 다양한 방법을 통해 수행 할 수 있습니다.
프로그램을 컴파일하면 컴파일러가 코드를 작성하여 프로그램 시작시 해당 DLL을로드합니다. 실제로 프로그램을 실행하려고 할 때 해당 DLL을 찾을 수 없으면 오류 메시지와 함께 실패합니다. 오류를 포착하고 대체 조치를 취할 코드를 작성할 방법이 없습니다.
운영 체제의 일부 (예 : kernel32.dll) 또는 적어도 일반적으로이 DLL과 함께 제공되는 dll의 경우 dll이 항상 존재한다고 가정 할 수 있으므로 즉시 로딩 동작은 문제가되지 않습니다. 반면에, 일반적으로 존재하지 않는 DLL에 대해 빌드하는 경우, 당신은 더 많은 관심을 가질 것입니다. 어느 쪽이든, 그러한 dll이 프로그램과 함께 배포되는지 확인해야합니다. 그렇지 않으면 어떻게 든 사용자가 시스템에 해당 dll을 가져 오는 데 필요한 다른 패키지를 설치하는지 확인해야합니다.
또한 dll이로드되지만 해당 dll에서 사용하려고하는 함수가 실제로 존재하지 않으면 오류 메시지와 함께 즉시 실패합니다. (프로그램이 함수를 호출하려고 시도 할 때까지 기다리지 않고 프로그램이 시작되고 중단 될 때이 불일치를 찾습니다.) dll의 다른 버전이 존재하는 경우 문제가 될 수 있습니다.
이제 LoadLibrary/GetProcAddress를 사용하면 선택한 시간에 dll을로드하고 해당 dll에서 제공하는 특정 기능을 찾으라는 메시지가 표시됩니다. 이러한 단계 중 하나라도 실패하면 합리적인 방법으로 처리하는 코드를 작성할 수 있습니다.
다양한 용도로 사용할 수 있습니다. 예를 들어, 프로그램에서 특정 폴더의 플러그인 dll을 검색하고로드하는 플러그인 메커니즘을 만들 수 있습니다. 프로그램이 어떤 플러그인이 나타날지 미리 알지 못하므로 LoadLibrary가이를 수행하는 유일한 방법입니다.
LoadLibrary/GetProcAddress를 사용할 수있는 또 다른 기능은 dll을로드하고 적절한 헤더 및 lib 파일이없는 경우에도 함수를 호출하는 것입니다. dll의 이름, 함수 이름 및 함수의 정확한 서명 (매개 변수 유형, 반환 유형, 호출 규칙)을 알고 있으면 해당 dll을로드하고 함수를 성공적으로 호출하는 코드를 작성할 수 있습니다. 때때로 이것은 유용 할 수 있습니다. 예를 들어, 사람들이 Windows dll에서 제공하는 "문서화되지 않은"특정 기능을 사용할 수있는 한 가지 방법입니다.
마지막으로 LoadLibrary/GetModuleHandle/GetProcAddress를 사용하면 지원하려는 모든 운영 체제에 반드시 존재하지는 않는 기능을 사용할 수 있습니다. 이는 GetNativeSystemInfo 또는 GetSystemInfo을 호출하는 코드 스 니펫의 원인 인 것으로 보입니다. 전자는 WinXP/2003에서만 사용할 수 있고 후자는 Win2000에서 사용할 수 있습니다. 코드가 GetNativeSystemInfo에 대한 직접 호출로 작성된 경우에는 프로그램이 Windows 2000에서 실행되지 않습니다. 대신에 현재 사용중인 시스템에 GetNativeSystemInfo가 있는지 확인하고 사용하는 경우에만 사용합니다. 그렇지 않으면 더 넓게 지원되는 GetSystemInfo로 대체됩니다.
예를 들어 어떤 함수를 호출할지 선택하는 방법은 지원하려는 운영 체제에 따라 다릅니다. 소프트웨어가 Windows 2000에서 실행될 필요가 없다면 GetNativeSystemInfo를 직접 호출하는 것이 훨씬 쉽습니다.
GetNativeSystemInfo()는 특별하기 때문에 사용할 수 없습니다 이전 버전의 Windows. GetProcAddress를 사용해야합니다. 이것은 OpenGL에는 적용되지 않습니다. –
GetNativeSystemInfo()는 예제 일 뿐이지 만 지금은 좋은 예제였습니다. 이제는 이해할 수 있습니다. – sanjuro