2010-06-26 2 views
1

라이브러리로 변환해야하는 응용 프로그램이 있습니다. 난 단지 프로젝트 조선 민주주의 인민 공화국을 복사하여 소스 파일을 변경했습니다 ': 당신이 볼 수 있듯이델파이 win32 응용 프로그램을 라이브러리로 변환하고 FreeLibrary를 동결

library aLibrary; 
    uses 
    FastMM4, 
    Forms, 
    SysUtils, 
    Windows, 
    Mainfrm in 'Mainfrm.pas' {Mainform}; 
{$R *.res} 
Procedure DllMain(Reason: Integer); 
Begin 
    If Reason = DLL_PROCESS_ATTACH Then 
    Begin 
     Application.Initialize; 
     Application.CreateForm(TMainForm, MainForm); 
     ExitCode := 0; 
    End; 
    If Reason = DLL_PROCESS_DETACH Then 
    Begin 
     Application.Terminate; 
     MainForm.Free; 
    End; 
End; 
Begin 
    DllProc := @DllMain; 
    DllProc(DLL_PROCESS_ATTACH); 
End. 

, 나는 단순히 응용 프로그램 초기화와 관련된 일반적으로 자동 생성 된 코드 라인을 제거 한을하고 DllMain 절차에 넣어 'program'키워드를 'library'로 변경했습니다. dll이 잘로드되고 임베디드 프로그램도 잘 실행되지만 호스트 프로세스에서 FreeLibrary를 해제 할 수는 없습니다. dll은 DLL_PROCESS_DETACH 코드가 무엇이든간에 (이 경우 아무 것도 입력하지 않아도) 멈 춥니 다.

모든 응용 프로그램을 해제하는 적절한 방법은 무엇입니까?

답변

9

귀하의 DLL 절차에서이 너무 많습니다.

DLL을로드하는 동안 OS는 로더 잠금을 획득합니다. 이렇게하면 다른 라이브러리가 동시에로드되지 않습니다. 아직로드되지 않은 라이브러리에있는 함수를 호출하면 해당 라이브러리를로드하려고 시도합니다. 여전히 로더 잠금 장치 안에 있기 때문에 다른 라이브러리는 잠금 자체를 획득하려고 시도하는 동안 블록화되어 교착 상태가됩니다. 언 로딩에는 유사한 규칙이 적용됩니다.

라이브러리를로드하거나 언로드하려면 DllMain 함수에서 절대 최소값을 지정해야합니다. 로딩이 완료되거나 언로드가 시작되기 직전에 DLL 호스트가 호출 할 수있는 별도의 함수로 나머지 모든 항목을 남겨 둡니다. 귀하의 경우 최소 금액은 아마도 입니다. 전혀입니다.

+0

잘 했어. Raymond Chen이 그것에 대해 썼습니다. http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx – ChristianWimmer

0

좋아, 나는 dll 잠금에 대한 요약을 잘 이해하고 있으며 일부 표준 수출 된 dll 루틴에 임베디드 응용 프로그램 생성자/소멸자를 넣었으므로 더 이상 DllMain이 없습니다. 그러나 freelibrary를 호출하면 여전히 교착 상태가 나타납니다. 내 dll은 실행 파일에서 인스턴스화 된 다른 dll로 인스턴스화됩니다. 잠금이 프로세스 계층의 하위 레벨에 도입되었을 수도 있습니다.

+0

스택 오버플로에 오신 것을 환영합니다. 질문 할 때 사용한 것과 같은 계정을 사용하여 로그인하십시오. 그렇게하면 답변에 첨부 된 * 댓글 *을 게시 할 수 있습니다. 그런 식으로 질문에 연루된 다른 사람들은 무언가가 일어 났음을 통보 받게 될 것입니다. 여기에 게시 한 내용은 게시 한 질문에 대한 답변이 아니므로 적절하지 않습니다. 이것은 코멘트로 게시되어 있어야합니다. 페이지 하단의 "고객 문의"링크를 사용하여 두 계정을 하나로 병합 할 수있는 관리자에게 문의 할 수 있습니다. –

관련 문제