2011-02-16 6 views
1

내 프로젝트는 내 제어하에 있지 않은 호스트 실행 파일로로드되는 플러그인 (Windows DLL)입니다. 내 DLL 일부 추가 libs로드하려고합니다. 저는 사적인 집회에서이 일을합니다. 이를 수행하는 방법은 how can a Win32 App plugin load its DLL in its own directory에 큰 답이 있습니다. 하지만 메인 DLL의 링크 라인에 /delayload dependentlib.dll을 추가하면 어셈블리를로드 할 필요가 없습니다. (필자는 여러 가지 이유로이 작업을 수행해야합니다.) Windows는 더 이상 내 개인 어셈블리를 검색하지 않습니다. 컴파일 된 매니페스트를 무시하는 것처럼 보입니다. 대신 DLL은 일반적인 검색 경로에서 지연로드 DLL을 찾습니다. (이것을 확인하기 위해 sysinternals procmon을 사용합니다.)Windows 개인 어셈블리를 어떻게 지연시킬 수 있습니까? 가능한가?

알려진 버그입니까, 아니면 다른 방법으로 어셈블리를 지연로드 할 수 있습니까? 차라리 LoadLibrary + GetProcAddress 라우트를 사용하지 않을 것입니다. 여기서 종속 라이브러리에서 신경 쓰이는 모든 심볼을 알고 있어야합니다.

답변

1

지연로드 함수에 대한 첫 번째 호출이 수행 될 때 응용 프로그램 기본 활성화 컨텍스트가 현재 컨텍스트입니다.

당신이해야 할 일은 자신의 매니 페스트를 가리키는 활성화 컨텍스트 (CreateActCtx)를 만드는 것입니다 (hinstance + resource id는 가능합니다).

그런 다음 모든 어셈블리를 랩핑하거나 적어도 처음에는 ActivateActCtx (및 해당 비활성화 기능)으로 dll을 호출하여 올바른 어셈블리가 검색되도록하십시오.

이론상으로 지연로드 helper 함수에 적절한 컨텍스트를 활성화하는 코드를 포함시킬 수 있습니다.

+0

감사합니다. 완벽하게 작동했습니다. 맞습니다. hmodule 및 리소스 ID (2) 만 있으면됩니다. 종속 DLL에 대한 첫 번째 호출을 래핑하면 모든 것이 완료됩니다. 감사합니다로드! – GaryO

0

이 동작은 의도적으로 설계된 것입니다. 기본적으로/DELAYLOAD를 지정하면 링커에 LoadLibrary 및 GetProcAddress 호출을 삽입하도록 지시하는 것입니다. 결과적으로 DLL을 지연로드 할 때의 동작은 LoadLibrary로 DLL을 동적으로로드하는 것과 동일합니다.

MSDN은 몇 가지 결과를 설명합니다. 더하기 측면에서 기본 동작을 재정의 할 수 있습니다. 나 자신의 지연로드 도우미 기능을 작성하는 것이 좋습니다.

FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry) 
{ 
    //... 
} 

링커는 지연된 DLL에서 진입 점을 해결해야 할 때마다이 함수를 호출합니다. 귀하의 버전은 비공개 어셈블리에 대한 사용자 정의 검색을 구현할 수 있습니다. Here's additional information about the helper function on MSDN.

관련 문제