Q&A

  • DLL에서 FreeLibrary를 하면 에러가 발생합니다.
안녕하세요..

제가 이번에 처음으로 dll을 하나 만들었는데요.

rs232통신을 모르는 사람들이 장비와 통신을 쉽게 하도록 하기 위해서

read/write 장비와 통신을 하는 기능을 넣은 겁니다.

dll 로드시에 TCommportdriver라는 통신용 콤포넌트를 하나 생성하고 언로드시에 해제를 합니다.

그렇게 만든 dll을 정적로딩 방식으로 테스트 프로그램을 만들어서 이상없이 동작하는 것을 확인한 후

배포를 했습니다.

그.런.데...

거래처 개발자에게서 전화가 온즉....

동적로딩을 한 후에 FreeLibrary를 하고 종료를 하면 액세스바이얼레이션 에러가 난다는 것이었습니다.

그래서 확인결과

<!--CodeS-->
procedure TForm1.Button1Click(Sender: TObject);
begin
  H := LoadLibrary( TP_DLL_NAME );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if FreeLibrary( H ) then
    ShowMessage('UnLoad Library Ok!')
  else
    ShowMessage('UnLoad Library Fail!');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//FreeLibrary( H )
end;
<!--CodeE-->

위와 같이 코드를 구성하고 테스트를 했더니 버튼2를 눌러 프리를 한 후에 프로그램을 종료하면 액세스 에러가

발생을 하더라구요.

그런데 로드한 후에 프리를 하지 않고 프로그램을 종료하거나 FormClose 이벤트에서 프리를 하면

액세스 에러가 발생하지 않는다는 것입니다...(으아...)

혹시 이런 경우는 어떤걸 의심해봐야 하나요?

처음 Dll을 제작할때 범하기 쉬운 오류로 인해 이런 경우가 발생할 수 있나요?

짐작되시는 부분에 대한 답변을 기다리겠습니다...

읽어주셔서 감사합니다..

그럼 수고하세요.
1  COMMENTS
  • Profile
    이희진 2006.04.29 01:07
    혹시 AllocMem을 사용하신 부분이 있나요?
    윈도우 API에 선언된 구조체를 가져다 쓸 경우,
    AllocMem을 사용하게 되는데, 이 때 size를 잘못 잡으면,
    아무 이상 없는 듯 넘어가지만, Free할 때 에러를 내뱉거든요.