Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
기존의 DLL을 동적 호출할 수 있는 방법이 없는지요.
음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다.
그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행할 때 호출해서 끝날때까지 연결되어 있는것이
낭비인거 같아서...
그래서 알아보니 나와있지가 않네요.-_-;
방법이 없다면 그냥 이렇게 연결해서 쓸 수 밖에 없지만 혹시 있나해서요...
아시는 분 가르쳐 주세용.
3
COMMENTS
최용일
•
2000.03.15 23:54
동적으로 링크하는 방법도 있습니다.
LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었다면 NULL을 리턴
하죠. 이미 적재되어 있다면 적재된 DLL의 핸들을 돌려줍니다. 에러코드는 GetLastError
함수를 써서 알아볼수 있습니다. LoadLibrary는 DLL의 레퍼런스카운트를 하나
증가시킵니다.
일단 적재한 뒤에 GetProcAddress를 사용하여 DLL의 export절에 선언된 모듈들을
네임맵핑합니다. (숫자에 의한 맵핑은 지원하지 않은것 같더군요.)
그런뒤에는 메인 프로그램에서 자유롭게 사용하실 수 있겠죠...
다 사용하신 뒤에는 FreeLibrary함수를 사용하여 DLL을 풀어주시면 됩니다.
FreeLibrary는 참조계수를 하나 감소시키고 참조계수가 0이 된다면 메모리에서
완전히 프리시킵니다.
윤정선 wrote:
> 음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다.
> 그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행할 때 호출해서 끝날때까지 연결되어 있는것이
> 낭비인거 같아서...
> 그래서 알아보니 나와있지가 않네요.-_-;
> 방법이 없다면 그냥 이렇게 연결해서 쓸 수 밖에 없지만 혹시 있나해서요...
> 아시는 분 가르쳐 주세용.
0
0
삭제
수정
댓글
윤정선
•
2000.03.17 01:25
자세한 설명을 부탁드려도 되는지요.
저는 LoadLibrary와 FreeLibrary를 이용해서 해볼려고 했는데 안되서 질문드린 거였거든요... 책에는 자세하지가 않아서 그런지 안되더라구요.
원래 그냥 기존 DLL을 호출할 때는 interface부분에서 프로시저 선언하고, implementation에서 프로시저가 위치한 DLL을 호출하잖아요. 예를들어서 이렇게요.
procedure AAA; external 'aaa.dll' name 'AAA';
이 부분이 LoadLibrary에서 GetProcAddress까지 과정에서 처리해 주는거 같긴한데,
잘 모르겠네요. 델파이 Help에 GetProcAddress가 안 나와있어서요..ㅠ.ㅠ
가르쳐 주시면 정말정말 감사드리겠습니당!!! ^^
참! 아래 가르쳐 주신 내용도 정말 감사드려요~ 꾸벅
최용일 wrote:
> 동적으로 링크하는 방법도 있습니다.
>
> LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었다면 NULL을 리턴
> 하죠. 이미 적재되어 있다면 적재된 DLL의 핸들을 돌려줍니다. 에러코드는 GetLastError
> 함수를 써서 알아볼수 있습니다. LoadLibrary는 DLL의 레퍼런스카운트를 하나
> 증가시킵니다.
>
> 일단 적재한 뒤에 GetProcAddress를 사용하여 DLL의 export절에 선언된 모듈들을
> 네임맵핑합니다. (숫자에 의한 맵핑은 지원하지 않은것 같더군요.)
>
> 그런뒤에는 메인 프로그램에서 자유롭게 사용하실 수 있겠죠...
>
> 다 사용하신 뒤에는 FreeLibrary함수를 사용하여 DLL을 풀어주시면 됩니다.
> FreeLibrary는 참조계수를 하나 감소시키고 참조계수가 0이 된다면 메모리에서
> 완전히 프리시킵니다.
0
0
삭제
수정
댓글
최용일
•
2000.03.17 06:14
안녕하세요. 최용일입니다.
먼저 헬프를 사용하는 방법부터 알려드리지요. GetProcAddress과 같은 Windows
API함수의 헬프를 보시려면 시작메뉴에서 델파이를 보시면 Help라는 하위 메뉴가
있습니다. 거기에서 MS SDK Help Files에서 Win32 Programmer's Reference헬프를
사용하시면 API함수들에 관한 헬프를 사용하실 수 있습니다. 델파이 IDE에서
API헬프를 사용하려면 완전한 함수 이름을 알아야 합니다. API함수이름을 에디터에
쓴 후 커서를 API함수 이름에다 놓고 Ctrl키와 함께 F1키를 누르시면 API헬프
파일을 열지 않고도 헬프를 사용하실 수 있습니다.
예제를 들어 설명하죠. 다음과 같은 DLL이 있다고 합니다.
library MyDLL;
function GetMax(Value1, Value2: Integer): Integer; stdcall;
begin
Result := Value1;
if Value1 < Value2 then
Result := Value2;
end;
function GetMin(Value1, Value2: Integer): Integer; stdcall;
begin
Result := Value1;
if Value1 > Value2 then
Result := Value2;
end;
exports
GetMax index 1;
GetMin index 2;
begin
end.
메인 함수내에서 다음과 같이 호출할 함수포인터변수를 선언합니다.
type
TGetValue: procedure (Value1, Value2: Integer): Integer;
var
GetValue: TGetValue;
혹은
var
GetValue: procedure (Value1, Value2: Integer): Integer;
인자는 DLL에 선언된 형태와 똑같이 써줄 필요는 없습니다. 단지 형만
같으면 됩니다.
DLL을 초기화 하고 함수를 동적으로 링킹합니다.
이미 설명해드렸던 함수들을 쓰니까 이해하기 어렵지 않으리라 생각됩니다.
procedure InitDLL;
var
DLLHandle: Integer;
begin
DLLHandle := LoadLibrary('MyDLL.DLL');
if DLLHandle <> 0 then
begin
// 함수포인터를 설정합니다. 동적으로
@GetValue := GetProcAddress(DLLHandle, 'GetMax');
if @GetValue <> nil then
begin
...
// 함수포인터는 일반함수와 똑같이 사용합니다. (프로시져도...)
ShowMessage('Max Value is ' + IntToStr(GetValue(10, 100));
...
end;
else
ShowMessage('Cant link DLL module');
...
// 파라매터형만 같으면 얼마든지 다른 함수로 바꾸어서 사용 가능합니다.
@GetValue := GetProcAddress(DLLHandle, 'GetMin');
if @GetValue <> nil then
begin
...
// 함수포인터는 일반함수와 똑같이 사용합니다. (프로시져도...)
ShowMessage('Min Value is ' + IntToStr(GetMin(10, 100));
...
end;
else
ShowMessage('Cant link DLL module');
...
FreeLibrary(DLLHandle);
end;
윤정선 wrote:
> 자세한 설명을 부탁드려도 되는지요.
>
> 저는 LoadLibrary와 FreeLibrary를 이용해서 해볼려고 했는데 안되서 질문드린 거였거든요... 책에는 자세하지가 않아서 그런지 안되더라구요.
> 원래 그냥 기존 DLL을 호출할 때는 interface부분에서 프로시저 선언하고, implementation에서 프로시저가 위치한 DLL을 호출하잖아요. 예를들어서 이렇게요.
> procedure AAA; external 'aaa.dll' name 'AAA';
> 이 부분이 LoadLibrary에서 GetProcAddress까지 과정에서 처리해 주는거 같긴한데,
> 잘 모르겠네요. 델파이 Help에 GetProcAddress가 안 나와있어서요..ㅠ.ㅠ
>
> 가르쳐 주시면 정말정말 감사드리겠습니당!!! ^^
> 참! 아래 가르쳐 주신 내용도 정말 감사드려요~ 꾸벅
>
>
> 최용일 wrote:
> > 동적으로 링크하는 방법도 있습니다.
> >
> > LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었다면 NULL을 리턴
> > 하죠. 이미 적재되어 있다면 적재된 DLL의 핸들을 돌려줍니다. 에러코드는 GetLastError
> > 함수를 써서 알아볼수 있습니다. LoadLibrary는 DLL의 레퍼런스카운트를 하나
> > 증가시킵니다.
> >
> > 일단 적재한 뒤에 GetProcAddress를 사용하여 DLL의 export절에 선언된 모듈들을
> > 네임맵핑합니다. (숫자에 의한 맵핑은 지원하지 않은것 같더군요.)
> >
> > 그런뒤에는 메인 프로그램에서 자유롭게 사용하실 수 있겠죠...
> >
> > 다 사용하신 뒤에는 FreeLibrary함수를 사용하여 DLL을 풀어주시면 됩니다.
> > FreeLibrary는 참조계수를 하나 감소시키고 참조계수가 0이 된다면 메모리에서
> > 완전히 프리시킵니다.
>
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
오종환
•
2000.03.16 03:02
1
COMMENTS
/
0
LIKES
팝업메뉴에 대해서
구창민
•
2000.03.16 03:10
오종환 wrote: > 저는 델파이를 막 접한 초보입니다 > > 제가 원하는것은 SpeedButton으로 기존의 메뉴...
J Wraw
•
2000.03.16 02:42
1
COMMENTS
/
0
LIKES
DB 연결시 error handle 하는방법 좀 알려주세요?
빡수홍
•
2000.03.16 03:53
J Wraw wrote: > MSSQL6.5를 쓰고있는데 DB connection시 UserId혹은 Password가 잘못입력시 > EDBEEngi...
양은주
•
2000.03.16 02:34
1
COMMENTS
/
0
LIKES
[컴포넌트]컴포넌트 제작에 관한 질문 입니다.
최용일
•
2000.03.16 03:11
메소드가 아니라 일반 프로시저나 펑션에서 호출하는 방법을 묻는 것입니까? 뭐 여러가지 방법이 있겠지만...
강동길
•
2000.03.16 02:01
1
COMMENTS
/
0
LIKES
table에 관한 질문있어요...
류종택
•
2000.03.16 02:11
Calulated Field를 사용하세요.. Table을 더블클릭하시고 생긴 윈도우에서 오른쪽 마우스 클릭.. Add All...
김진석
•
2000.03.16 01:55
2
COMMENTS
/
0
LIKES
다단 복수 타이틀 그리드 있나요????
blueSky
•
2000.03.16 02:51
김진석 wrote: > 프로그램을 짜다 보니깐.... | 신 문| > ...
조피디
•
2000.03.16 02:00
김진석 wrote: > 프로그램을 짜다 보니깐.... | 신 문| > ...
초보
•
2000.03.16 01:44
4
COMMENTS
/
0
LIKES
단축 아이콘을 만드려면?
류종택
•
2000.03.16 02:04
천리안 프로그래머 포럼에서 주어왔습니다.. From 류.. --------- unit Link; interface ...
초보
•
2000.03.17 10:27
류종택님 답변 감사드립니다만. 답변 주신 소스를 보고 어떻게 해야할지 막막하네요 복사해서 실행해도 ...
모질이
•
2000.07.31 22:24
바탕화면에 단축아이콘을 만들려면 인스톨쉴드에서 간단하게 할수가 있거덜랑요. specify folders and ic...
최용일
•
2000.03.16 14:49
한델의 강좌란을 보세요...
한현정
•
2000.03.16 01:13
4
COMMENTS
/
0
LIKES
프로그램 종료전에 만든 excel이 안 읽혀요
하윤철
•
2000.04.12 21:40
답을 얻으셨나요? 꽤 늦은 답입니다만.... 변환 작업 후에 프로그램 종료시점까지 Excell 인스턴스종료로...
최용일
•
2000.03.16 01:28
아마도 열기 전에 저장을 안하신것 같은데... 대강 코드를 보니까 프로그램을 종료할 때 만들어진 엑셀...
한현정
•
2000.03.16 02:08
아래 소스는 컴포넌트의 소스입니다. 호출할 때는 아래와 같이 하구요 MsgBar1.ShowMessage('excel...
최용일
•
2000.03.16 05:01
제가 김영대님의 TGridXLS컴포넌트를 써보지 못해서 제대로 답변을 못드리겠군요. 김영대님에게 메일을 보...
국경훈
2000.03.16 00:40
0
COMMENTS
/
0
LIKES
[긴급]gif image 출력에 관한 질문
topsman
•
2000.03.16 00:35
2
COMMENTS
/
0
LIKES
현재의 OS 정보를 알려면...
blueSky
•
2000.03.16 01:17
topsman wrote: > 현재 사용자가 사용하고 있는 OS가 어떤건지 알려면... > > 어떤 함수를 써서...정보...
하얀까마귀
•
2000.03.16 01:03
안녕하세요 하얀까마귀 입니다. 그런 정보는 레지스트리에 있어요... HKEY_LOCAL_MACHINE SoftwareM...
조영태
2000.03.16 00:12
0
COMMENTS
/
0
LIKES
알바하실분---[ 내써버 ]
혀노
2000.03.15 23:58
0
COMMENTS
/
0
LIKES
퀵레포트 미리보기시 메인폼이 앞에 나옴
이영일
2000.03.15 23:19
0
COMMENTS
/
0
LIKES
[재질문] DB공유에 관하여 제발 부탁....
전진배
•
2000.03.15 23:17
1
COMMENTS
/
0
LIKES
QRCompositeReport 사용시 customer preview 사용방법?
하얀까마귀
•
2000.03.16 00:53
안녕하세요 하얀까마귀 입니다. 이건 전에 제가 비슷한 내용을 올린것 같은데.... 어디 올렸지???? ...
문영봉
•
2000.03.15 23:16
2
COMMENTS
/
0
LIKES
tregistry 에 대하여 좀.. 알려주세요
류종택
•
2000.03.16 00:08
현재 위치에서 'f1'이라는 키를 오픈하는 것입니다.. 뒤에오는 불린은 해당 키가 없을 때 생성을 할 것인...
최용일
•
2000.03.16 00:03
OpenKey는 레지스트리에 있는 키값을 열때 사용합니다. TRegistry서 값을 읽거나 쓰는 함수(TRegistry.Rea...
hjcho
2000.03.15 23:08
0
COMMENTS
/
0
LIKES
도와주세요.
윤정선
•
2000.03.15 23:07
3
COMMENTS
/
0
LIKES
기존의 DLL을 동적 호출할 수 있는 방법이 없는지요.
음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다. 그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행...
최용일
•
2000.03.15 23:54
동적으로 링크하는 방법도 있습니다. LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었...
윤정선
•
2000.03.17 01:25
자세한 설명을 부탁드려도 되는지요. 저는 LoadLibrary와 FreeLibrary를 이용해서 해볼려고 했는데 안되...
최용일
•
2000.03.17 06:14
안녕하세요. 최용일입니다. 먼저 헬프를 사용하는 방법부터 알려드리지요. GetProcAddress과 같은 Windo...
neocity
•
2000.03.15 22:34
1
COMMENTS
/
0
LIKES
돔을 필요합니다.
화랑
•
2000.03.16 02:59
neocity wrote: > 다중 채팅을 만들었는데. > 여러 채팅 프로그램처럼 여러개의 방을 만들려구 하는데 >...
topsman
•
2000.03.15 22:27
3
COMMENTS
/
0
LIKES
procedure나 function에서 임의의 지점에서 return하는 방법...
하얀까마귀
•
2000.03.16 00:38
안녕하세요 하얀까마귀 입니다. c하고는 문법이 조금 다르죠... c를 windows c++을 하셧는지는 모르...
백록화
•
2000.03.16 00:22
yo~ ^^*^~ exit나 break 같은 제어문을 적절히 사용하시면 됩니다. exit는 그냥 중단하는것이고..... ...
강인규
•
2000.03.15 22:39
우선 저는 C는 못합니다. 그점 염두하시고 보아주시기 바랍니다. return이 어떤 형태로 작업열로 복귀하...
홍종숙.....
2000.03.15 21:34
0
COMMENTS
/
0
LIKES
안녕하세요.전 컴퓨터 관련학과에 재학중인 학생입니다
이수정
•
2000.03.15 21:25
1
COMMENTS
/
0
LIKES
컴포넌트 파일을 어떻게 사용하는지요..?
blueSky
•
2000.03.15 22:24
이수정 wrote: > 다른데 자료실에서.. 컴포넌트 파일이라며.. > > .pas 파일 두개를 받았는데.. > ...
윤정선
2000/03/15 23:07
Views
301
Likes
0
Comments
3
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었다면 NULL을 리턴
하죠. 이미 적재되어 있다면 적재된 DLL의 핸들을 돌려줍니다. 에러코드는 GetLastError
함수를 써서 알아볼수 있습니다. LoadLibrary는 DLL의 레퍼런스카운트를 하나
증가시킵니다.
일단 적재한 뒤에 GetProcAddress를 사용하여 DLL의 export절에 선언된 모듈들을
네임맵핑합니다. (숫자에 의한 맵핑은 지원하지 않은것 같더군요.)
그런뒤에는 메인 프로그램에서 자유롭게 사용하실 수 있겠죠...
다 사용하신 뒤에는 FreeLibrary함수를 사용하여 DLL을 풀어주시면 됩니다.
FreeLibrary는 참조계수를 하나 감소시키고 참조계수가 0이 된다면 메모리에서
완전히 프리시킵니다.
윤정선 wrote:
> 음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다.
> 그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행할 때 호출해서 끝날때까지 연결되어 있는것이
> 낭비인거 같아서...
> 그래서 알아보니 나와있지가 않네요.-_-;
> 방법이 없다면 그냥 이렇게 연결해서 쓸 수 밖에 없지만 혹시 있나해서요...
> 아시는 분 가르쳐 주세용.