Q&A

  • 기존의 DLL을 동적 호출할 수 있는 방법이 없는지요.
음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다.

그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행할 때 호출해서 끝날때까지 연결되어 있는것이

낭비인거 같아서...

그래서 알아보니 나와있지가 않네요.-_-;

방법이 없다면 그냥 이렇게 연결해서 쓸 수 밖에 없지만 혹시 있나해서요...

아시는 분 가르쳐 주세용.

3  COMMENTS
  • Profile
    최용일 2000.03.15 23:54
    동적으로 링크하는 방법도 있습니다.



    LoadLibrary함수를 DLL을 적재하시면 됩니다. 성공적으로 적재되었다면 NULL을 리턴

    하죠. 이미 적재되어 있다면 적재된 DLL의 핸들을 돌려줍니다. 에러코드는 GetLastError

    함수를 써서 알아볼수 있습니다. LoadLibrary는 DLL의 레퍼런스카운트를 하나

    증가시킵니다.



    일단 적재한 뒤에 GetProcAddress를 사용하여 DLL의 export절에 선언된 모듈들을

    네임맵핑합니다. (숫자에 의한 맵핑은 지원하지 않은것 같더군요.)



    그런뒤에는 메인 프로그램에서 자유롭게 사용하실 수 있겠죠...



    다 사용하신 뒤에는 FreeLibrary함수를 사용하여 DLL을 풀어주시면 됩니다.

    FreeLibrary는 참조계수를 하나 감소시키고 참조계수가 0이 된다면 메모리에서

    완전히 프리시킵니다.



    윤정선 wrote:

    > 음~~ 또 질문이 있는데요, 포트란에서 만든 DLL을 델파이로 짠 프로그램에서 호출해서 사용하고 있습니다.

    > 그런데 프로그램을 실행하는 내내 DLL이 필요한 것이 아니라, 어떤 기능을 요하는 작업을 할 때만 쓰면 되거든요. 프로그램 실행할 때 호출해서 끝날때까지 연결되어 있는것이

    > 낭비인거 같아서...

    > 그래서 알아보니 나와있지가 않네요.-_-;

    > 방법이 없다면 그냥 이렇게 연결해서 쓸 수 밖에 없지만 혹시 있나해서요...

    > 아시는 분 가르쳐 주세용.

  • Profile
    윤정선 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이 된다면 메모리에서

    > 완전히 프리시킵니다.



  • Profile
    최용일 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이 된다면 메모리에서

    > > 완전히 프리시킵니다.

    >

    • 오종환
    • 2000.03.16 03:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2000.03.16 03:10
      오종환 wrote: > 저는 델파이를 막 접한 초보입니다 > > 제가 원하는것은 SpeedButton으로 기존의 메뉴...
    • 빡수홍
      2000.03.16 03:53
      J Wraw wrote: > MSSQL6.5를 쓰고있는데 DB connection시 UserId혹은 Password가 잘못입력시 > EDBEEngi...
    • 최용일
      2000.03.16 03:11
      메소드가 아니라 일반 프로시저나 펑션에서 호출하는 방법을 묻는 것입니까? 뭐 여러가지 방법이 있겠지만...
    • 강동길
    • 2000.03.16 02:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 류종택
      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.04.12 21:40
      답을 얻으셨나요? 꽤 늦은 답입니다만.... 변환 작업 후에 프로그램 종료시점까지 Excell 인스턴스종료로...
    • 최용일
      2000.03.16 01:28
      아마도 열기 전에 저장을 안하신것 같은데... 대강 코드를 보니까 프로그램을 종료할 때 만들어진 엑셀...
    • 한현정
      2000.03.16 02:08
      아래 소스는 컴포넌트의 소스입니다. 호출할 때는 아래와 같이 하구요 MsgBar1.ShowMessage('excel...
    • 최용일
      2000.03.16 05:01
      제가 김영대님의 TGridXLS컴포넌트를 써보지 못해서 제대로 답변을 못드리겠군요. 김영대님에게 메일을 보...
    • topsman
    • 2000.03.16 00:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • blueSky
      2000.03.16 01:17
      topsman wrote: > 현재 사용자가 사용하고 있는 OS가 어떤건지 알려면... > > 어떤 함수를 써서...정보...
    • 하얀까마귀
      2000.03.16 01:03
      안녕하세요 하얀까마귀 입니다. 그런 정보는 레지스트리에 있어요... HKEY_LOCAL_MACHINE SoftwareM...
    • 하얀까마귀
      2000.03.16 00:53
      안녕하세요 하얀까마귀 입니다. 이건 전에 제가 비슷한 내용을 올린것 같은데.... 어디 올렸지???? ...
    • 문영봉
    • 2000.03.15 23:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 류종택
      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
    • 최용일
      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: > 다중 채팅을 만들었는데. > 여러 채팅 프로그램처럼 여러개의 방을 만들려구 하는데 >...
    • 하얀까마귀
      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이 어떤 형태로 작업열로 복귀하...
    • blueSky
      2000.03.15 22:24
      이수정 wrote: > 다른데 자료실에서.. 컴포넌트 파일이라며.. > > .pas 파일 두개를 받았는데.. > ...