흑, 함수 이름이 다르다고 찝어주신 분이계시네요. 이런 실수를.. 다음부터는 함수 이름 지을때 쉽게 지어야겠습니다.
메모리 에러는 initialization과 finalization에 대한 구현 코딩을 추가해 주니 사라지네요.
단비 님이 쓰신 글 :
: 말씀하신대로 수정해 보았습니다만, 동일한 에러가 발생합니다.
: 하나는 되고 하나는 안되니, 죽겠군요.
:
: 그러면 혹, 정적으로 DLL을 로드하였을때 DLL 내의 함수 사용후 메모리 에러가 납니다. 이 것을 효과적으로 해결할 가이드가 없을까요?
:
: 정적으로 로드했을때는 첨부한 그림들과 같이 에러를 냅니다.(그림이 두장 첨부됩니다.)
:
: civilian,안영제 님이 쓰신 글 :
: : 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.
|