DLL 및 Application을 만들고 호출하였습니다.
DLL을 호출하기 위한 선언부는 다음과 같습니다.(동일한 DLL을 정적으로 혹은 동적으로 로드하기 위하여 선언하는 것입니다. 실제로는 둘중의 하나만 필요하지요.)
//Static DLL 함수 선언
function CreateCheck( ExeApplication: TApplication; ExeScreen: TScreen ):integer; external 'AutoUpdateCheck.dll' name 'CreateChecker';
//Dynamic DLL 함수 선언
function CreateCheck( ExeApplication: TApplication; ExeScreen: TScreen ):integer; export; stdcall; external 'AutoUpdateCheck.dll';
선언에 따른 실행 코드는 다음과 같습니다.
//DLL Static Call
procedure TfrMain.dxbtnUptCheckClick(Sender: TObject);
var
iret:integer;
begin
iret := CreateCheck( Application, Screen ); //업데이트 체크
end;
//DLL Dynamic Call
procedure TfrMain.XibtnUptClick(Sender: TObject);
var
ProcAddr : FarProc;
DllHandle : THandle;
iret : integer;
begin
DllHandle := LoadLibrary('AutoUpdateCheck');
ProcAddr := GetProcAddress(DllHandle, 'CreateChecker');
if ProcAddr <> nil then
iret := CreateCheck( Application, Screen ); //업데이트 체크
end;
문제는, 정적으로 로딩할때는 잘 로딩이 되며, 실행도 잘 됩니다. 그러나 메인 어플리케이션을 종료할 때, 메모리 에러를 냅니다. 아마도 메모리 해제를 잘 못해준 모양입니다.(그런데 정적으로 로드하다보니 DLL 핸들을 잡아낼 수 없어서 DLL핸들을 해제 못하겠더군요.)
그래서 동적으로 로드해 보았습니다. 그랬더니 프로시저 시작지점을 찾을 수 없답니다. 뭔가 선언을 잘못한 것 같기도 한데... 무엇을 잘못했을 까요?
다음은 DLL에서 함수 선언부입니다.
{$R *.res}
function CreateChecker( ExeApplication: TApplication; ExeScreen: TScreen ):integer;
var
iret:integer;
bret:Boolean;
begin
Application := ExeApplication;
Screen := ExeScreen;
if BasicFrm = nil then BasicFrm := TBasicFrm.Create( Application );
bret := BasicFrm.doCheck;
if bret = true then
iret := 1
else
iret := 0;
BasicFrm.Free;
Result := iret;
end;
exports
CreateChecker;
begin
end.
|