Q&A

  • 한 개의 dll을 어플리케이션과 또다른 dll이 사용할 때
dll A를 어플리케이션 B와 dll C가 동시에 사용하려고 합니다.

이 때 B에서 A를 호출하여 A가 가지고 있는 변수값을 C가 그대로 사용할 수 있는지요?

혹시 같은 dll이라도 서로 다르게 사용하는 것은 아닌지요?

서로 공유하며 사용하고 싶은데...



고수님들 도움 좀 부탁드립니다.

1  COMMENTS
  • Profile
    김지태 2001.11.13 19:57
    털털이 wrote:

    > dll A를 어플리케이션 B와 dll C가 동시에 사용하려고 합니다.

    > 이 때 B에서 A를 호출하여 A가 가지고 있는 변수값을 C가 그대로 사용할 수 있는지요?

    > 혹시 같은 dll이라도 서로 다르게 사용하는 것은 아닌지요?

    > 서로 공유하며 사용하고 싶은데...

    >

    > 고수님들 도움 좀 부탁드립니다.



    안냐세영.. UserSpace임덩...



    날씨가 몹시 추워졌군여, 어제밤에 좀 떨고 잤거덩여... 히히.



    간단하게 DLL에 대해 설명을 하자면,



    우선 프로그램은 (Stack) + (Heap) + (Text) + (Global Variable )로 구성되어 있습니다.



    여기서 변화되지 않는 부분은 code부분이지요.



    그래서 여러개의 프로그램이 공유할 수 있도록 빼서 독립적인 모듈을 만들었는데,



    이것이 DLL임니다. 그래서 DLL은 Heap이나 Stack 그리고 Global Variable까지도



    자체적으로 가지고 있는 것이 없읍니다. 만약 가지고 있다면 더큰 문제지요.



    많은 프로그램이 공유하는 DLL일수록 A가 변경하게 되는 변수를 B가 잘못 사용



    하게 될테니깐여. 그럼 이런 모든 변수와 메모리는 어디에 있냐하면여,



    그 DLL을 호출한 프로그램의 메모리 영역(각각의 Stack, Heap)에 있게 됩니다.



    그러나 DLL의 자체적인 공유메모리를 만드는것이 안되는 것은 아닙니다.



    예전의 Windows3.1 까지는 이것을 이용해서 사용했었는데 95에서는 거의 무시되었습니다.



    그러나 아직까지도 Hooking이나 System Control 같은 용도로 사용할 경우에는 사용



    하게 됩니다. 그러나 불행이도 제가 DLL을 만들때는 주로 Visual C++을 사용해서



    지금 알고 있는건 C++임덩.



    #pragma data_seg( "SHARDATA" )

    int i_comm;

    #pragma data_seg()





    DEF 파일

    SECTIONS

    SHARDATA ReadWriteShared



    라고 하면 되는데, Delphi에서는 이것을 어케 써야하는지 정확히 제가 모르겠군여.



    죄송함덩. 책에 자세히 안나와 있어서리... ^_^;; (식음땀)







    하지만 다른방법도 있습니다.



    C++이면 Class의 Static변수를 선언하는 방법과



    메모리 메핑파일을 만들어서 사용하면 됩니다.



    Handle := CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0, Size, 'SharData' );



    위의 자세한 내용은 Delphi책이면 또는 다른책들도 많이 나와 있습니다.



    혹 가지고 있는 책이 한권도 없다고는 말씀하시진 않겠죠? ㅡㅡ;



    결론적으로



    > 이 때 B에서 A를 호출하여 A가 가지고 있는 변수값을 C가 그대로 사용할 수 있는지요?

    -> 기양은 사용할수 없고 위의 방법중 하나를 선택하심이...



    > 혹시 같은 dll이라도 서로 다르게 사용하는 것은 아닌지요?

    -> 위에서 설명 했듯이 DLL은 자체적인 메모리가 없고 code부분만 있습니다. 다시말해

    DLL은 LIB처럼 procedure와 function만 제공한다고 보시면 됩니다.



    > 서로 공유하며 사용하고 싶은데...

    -> 방법을 강구하시면 얼마든지.

    1. 공유메로리 설정.

    2. 메모리 메핑.

    3. 레지스트리.

    4. INI파일 (or TXT파일)





    조금이나마 도움이 되었으면 하군여, 그럼 저도 업무가 밀려서...



    즐코하세영... ^^