2012-10-12 2 views
0

내 코드가 정적/암시 적으로 링크 된 DLL (DLLB라고 부름)이지만 런타임에 찾을 수없는 라이브러리를 사용하고 있습니다.내가 연결할 DLL을 찾는 데 도움이되는 최적의 방법은 무엇입니까?

DLLB를 호출하는 코드와 동일한 디렉터리에 DLLB를 배치 했음에도 불구하고. (호출 코드 자체는 DLL, arcpy에서 호출 된 python에서 호출되는 DLLA입니다. 왜 Python이 DLLA를 찾았지만 DLLA가 DLLB를 찾지 못했지만 동일한 디렉토리에 있음에도 불구하고) .

시스템 경로의 어딘가에 라이브러리 DLL을 넣으면 모든 것이 잘 작동합니다.

하지만 배포에 가장 적합한 방법은 무엇입니까? 설치시 클라이언트 시스템의 시스템 경로에 항목을 추가 하시겠습니까? DLL을로드하기 전에 런타임시 Python에서 시스템 경로를 수정 하시겠습니까? 다른 것?

답변

3

파이썬은 LoadLibrary 호출에서 DLL의 전체 경로를 지정해야합니다. 권장되는 방법입니다. 모듈 이름 만 지정하면 틀린 DLL을로드 할 위험이 있으며 아마도 binary planting vulnerability이 도입 될 수 있습니다.

기본 검색 경로에는 실행 파일이로드 된 디렉터리가 포함되어 있지만 다른 DLL이로드 된 디렉터리는 포함되지 않습니다. 그래서 당신이보고있는 행동은 예상대로입니다.

동적로드를 사용할 수있는 경우 DLLA에 대한 경로를 찾아 DLLB에 대한 경로를 구성하는 데 사용할 수 있습니다.

DLLA에 대한 모듈 핸들을 얻으려면 GetModuleHandleEx을 호출하십시오. 모듈 핸들에서 DLLA에 대한 전체 경로를 얻으려면 GetModuleFileName을 호출하십시오. 마지막 요소가 DLLA.dll인지 확인하고 DLLB.dll로 바꾸십시오. 그런 다음 LoadLibrary를 호출 할 수 있습니다.

+0

맞아, 파이썬에서 DLLA의 전체 경로를 지정합니다. DLLB 아라비아 동적로드를 지원하지 않는 제 3 자 라이브러리입니다. 어떤 것이 가장 좋은지에 대한 의문을 남기고 - 시스템 경로를 수정합니까? 어떻게 든 파이썬을 위해 이것을 할 수 있고 그것은 DLL을로드합니까? –

+0

항상 동적으로 DLL을로드 할 수 있습니다. (거의 항상 그렇습니다.) 가장 가능성있는 문제는 암시적인로드가 아닌 명시 적으로 사용하도록 DLLA의 코드를 변경하는 것이 너무 어려울 수 있다는 것입니다. 최선의 해결책은 DLLA를로드하기 전에 Python *에서 DLLB를 명시 적으로로드하는 것입니다. 암시 적로드는 이미 메모리에 있으므로 올바른 DLL을 찾습니다. 그러나 대신'os.environ' 매핑 객체를 사용하여 프로세스의 PATH 환경 변수를 수정할 수 있습니다. 디렉토리를 PATH에 앞에두고 싶지만 갈등이없는 디렉토리가 있는지 확인하십시오. –

+0

아하! http://msdn.microsoft.com/en-us/library/784bt7z7%28v=vs.100%29.aspx –

관련 문제