Windows 플랫폼에서 애플리케이션에 DLL 모듈을 로드하는 문제에 대해 설명합니다.

4712 단어 windows
이 문서에서는 다음을 다룹니다.
(1) Windows 실행 프로그램이 DLL을 로드할 디렉토리
(2) EXE와 같은 디렉토리가 아닌 실행 가능한 DLL을 통합 디렉토리에 배치하는 방법.
(3) 실행 프로그램이 로드하지 말아야 할 DLL을 로드했습니다.
(4) Win7, Win8에서 "\Windows\System32"의 실행 프로그램에서 DLLL을 로드할 수 없습니다.
 
(1)
실행 가능한 프로그램을 시작할 때, 이 프로그램이 다른 DLL을 불러올 필요가 있다면, DLL의 경로가 전체 경로가 아닐 때, 현재 디렉터리에서 먼저 찾고, 시스템 디렉터리를 다시 검색할지, 찾지 못하면 환경 변수 path의 디렉터리를 순서대로 검색합니다.이 순서는 매우 중요하다.
내 시스템의 기본 환경 변수 path 디렉토리는 다음과 같습니다.
C:\Program Files (x86)\Microsoft DirectX SDK (June 2007)\Utilities\Bin\x86;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\TortoiseSVN\bin;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;;C:\Program Files (x86)\Microsoft Visual Studio 9.0\;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
 
(2)
발표된 소프트웨어 디렉터리를 명확하게 하기 위해서, 나는 보통 응용 프로그램이 사용하는 DLL을 하나의 통일된 디렉터리에 두는데, 방법은 path 환경 변수를 설정하는 것이다.
VC 환경에서 다음 코드를 사용하여 path 환경 변수를 설정할 수 있습니다.
 1     //   Path    
 2     char szOldPathBuffer[4096] = { 0 };  3     char szCurrPath[256] = { 0 };  4     char szNewPathBuffer[4096] = { 0 };  5     ::GetEnvironmentVariable("Path", szOldPathBuffer, sizeof(szOldPathBuffer));  6     ::GetCurrentDirectory(sizeof(szCurrPath), szCurrPath);  7  ::sprintf(szNewPathBuffer,  8         "%s\\ExternDll;%s",  9  szCurrPath, szOldPathBuffer); 10 
11     if(!::SetEnvironmentVariable("Path", szNewPathBuffer)) 12  { 13         ::MessageBox(NULL, szNewPathBuffer, "ERROR: Set Environment Failed!", 0); 14     }

 
(3)
이렇게 하면 애플리케이션에서 로드하지 말아야 할 DLL을 로드하는 문제가 발생할 수 있습니다.
예를 들어, 프로그램에서 DLL을 'physxcore.dll' 로 사용하고, 이 DLL을 path 환경 변수 디렉터리에 두어야 한다.사용자의 시스템 디렉터리에도 마침 physxcore가 존재한다.dll.만약 두 개의 physxcore.dll버전이 일치하지 않으면 프로그램이 시작되지 않거나 이상한 문제가 발생할 수 있습니다.이것은 내가 직접 겪은 문제인데, 당시에는 매우 이상하게 여겼는데, 몇 대의 똑같이 배치된 기계가 어째서 하필 한 대가 운행할 수 없을까?이 기계에 어떤 소프트웨어가 설치되어 있는지 모르겠습니다. 이 소프트웨어는 이physxcore를 사용합니다.dll가 시스템 디렉터리에 놓여 있습니다.해결 방법은physxcore.dll을 EXE 파일과 같은 디렉토리에 배치합니다.
 
(4)
나는 프로그램을 WIN7, WIN8의 "\Windows\System32"디렉터리에 놓으면, 프로그램이 어떤 DLL도 표시하거나 은밀하게 불러오는 것을 불법으로 불러옵니다.이 문제는 나를 매우 오랫동안 괴롭혔다. 왜냐하면 나는 몇 개의 스크린 프로그램을 썼기 때문이다. 이 프로그램들은 XP에서 스크린을 설치하는 것은 매우 정상적이지만 Win7, Win8에서는 실행할 수 없다.지금까지 나도 어떤 합리적인 해석도 찾지 못했다.그러나 응용 프로그램을 '\Windows\syswow64' 또는 '\Windows\syswow32' 에 놓을 수도 있고, 이 디렉터리에 놓을 수도 있고, 화면 보호식으로 실행할 수도 있다.

좋은 웹페이지 즐겨찾기