db의 내용을 읽어서 exe 프로그램의 treeview에다가 db의 내용을 treeview형태
로 만들어 주는 모듈을 dll로 작성하였는데....
메인 프로그램(exe)에서 dll을 동적호출(loadlibrary)을 이용하여 해당 dll
의 함수를 call하고 있습니다..
dll내의 함수원형은 Procedure libmenu_loadmenu(treeview1: TTreeview); stdcall; 이렇게 선언되어 있구요....
메인 프로그램에서는 libmenu_loadmene(treeviewMenu);요렇게 호출을 합니다.
근데.. 정상적으로 동작을 하는데...
loading된 dll을 FreeLibary로 해제하면 access violation Error가 발생을
하는데..... 도무지 이유를 모르것네요....
그래서 dll내의 함수를 Procedure libmenu_loadmenu(VAr treeview1: TTreeview); stdcall;로 바꾸어 봐돠 access violation Error가 발생을 하고
정정인 DLL 함수호출을 사용하면 전혀 문제가 없는데......
전문가님의 도움을 기다립니다...
> db의 내용을 읽어서 exe 프로그램의 treeview에다가 db의 내용을 treeview형태
> 로 만들어 주는 모듈을 dll로 작성하였는데....
>
> 메인 프로그램(exe)에서 dll을 동적호출(loadlibrary)을 이용하여 해당 dll
> 의 함수를 call하고 있습니다..
> dll내의 함수원형은 Procedure libmenu_loadmenu(treeview1: TTreeview); stdcall; 이렇게 선언되어 있구요....
>
> 메인 프로그램에서는 libmenu_loadmene(treeviewMenu);요렇게 호출을 합니다.
>
> 근데.. 정상적으로 동작을 하는데...
> loading된 dll을 FreeLibary로 해제하면 access violation Error가 발생을
> 하는데..... 도무지 이유를 모르것네요....
> 그래서 dll내의 함수를 Procedure libmenu_loadmenu(VAr treeview1: TTreeview); stdcall;로 바꾸어 봐돠 access violation Error가 발생을 하고
> 정정인 DLL 함수호출을 사용하면 전혀 문제가 없는데......
>
> 전문가님의 도움을 기다립니다...
이렇게 해보세요...
procedure TForm1.Button1Click(Sender: TObject);
type
TGetDistance = Procedure(treeview1: TTreeview); //선언
var
handle : thandle;
GetDistance: TGetDistance;
FuncPtr: TFarProc;
begin
handle:=loadlibrary('project2.dll'); //dll을 로드
FuncPtr:=GetProcAddress(handle,'libmenu_loadmenu'); //해당 프로시져로드해서 변수에 집어 넣음..
@GetDistance :=FuncPtr; // 해당 프로시져로
GetDistance('aaa'); // 프로시져실 실행 이때 aaa에 넘겨줄 인자
freelibrary(handle); // dll 해제
end;
대답이 되셨기를...
이렇게 해도 문제가 나타난다면 dll의 문제는 아닌것 같습니다..
류민철..