DLL 내의 함수 선언부에
function CreateChecker( ExeApplication: TApplication; ExeScreen: TScreen ):integer; stdcall;
임포트 함수 선언은
function CreateCheck( ExeApplication: TApplication; ExeScreen: TScreen ):integer; stdcall; external 'AutoUpdateCheck.dll';
단비 님이 쓰신 글 :
: 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.
|