동적으로 메모리에 로드 해서 사용하면 메모리를 적게 사용하나

빈번히 호출되고 제거 될때는 시스템의 퍼포먼스가 떨어짐,정적로드는 시스템 퍼포먼스와는 관계 없음

  :

type
  TfExternalFun_Dyn = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fExternalFun_Dyn: TfExternalFun_Dyn;

implementation

{$R *.dfm}

procedure TfExternalFun_Dyn.BitBtn1Click(Sender: TObject);
var
 iDllHND : THandle;     //메모리에 로딩과 제거를 위해서 핸들값 필요


 //메모리에 로드된 dll의함수를 사용하기 위해서 그 함수를 담을수 있는 변수를 선언함
 // 그 변수는 반드시 해당 함수와 같은 타입이어야 됨 즉,해당 함수의 레퍼런스 변수

 FunLibVar : Function (a,b:Integer): Integer;
begin

  try
    iDllHND := LoadLibrary('DLL_TEST\PTestDll.dll');  //해당 dll를 메모리에 로드하고 핸들값을 받음


    if iDllHND >= 32 then                                              //핸들 값이 32 이하 일때는 오류-32 이하는 시스템에서 오류로 사용
    begin
      @FunLibVar := GetProcAddress(iDllHND,'Sum');  //메모리에 로딩된 dll에서 Sum 이라는 함수의 주소를 가져옴
      if @FunLibVar <> Nil then
        ShowMessage(intTostr(FunLibVar(12,7)));          //외부함수 사용
    end;


  finally
    FreeLibrary(iDllHND);                                       //메모리에서 해제
  end;
end;


// DLL 에 있는 폼 띄우는 Procedure 호출하기

procedure TfExternalFun_Dyn.BitBtn2Click(Sender: TObject);
var
 iHND : THandle;
 ProcLibVar : Procedure;
begin
  Try
    iHND := LoadLibrary('DLL_TEST\PTestDll.dll');
    @ProcLibVar := GetProcAddress(iHND,'ShowFrm');  // ShowFrm 라는 프로시져 주소 할당
    if @ProcLibVar <> Nil then ProcLibVar;
  finally
    FreeLibrary(iHND);
  end;

end;

  :

출처 : codeway.co.kr


Posted by 옴팡투덜이
BLOG main image
by 옴팡투덜이

공지사항

카테고리

분류 전체보기 (59)
감상과 비평 (15)
자기 고찰 (0)
Infomation (40)
아이디어 (0)
일탈을 꿈꾸는 나의 일상 (1)

최근에 올라온 글

최근에 달린 댓글