본문 바로가기

Passion::취업준비

8월 26일 경제_DLL

<br />
기사 정리

약 투자가 부진한 8월 현재 투자해야할 만한 가치가있는 중점 주식
 역시 실적이 최고!

좋은 종목을 가리는데는 우선 실적을 보지 않을 수 없다.

NH투자증권은 2분기 실적을 반영해 관심주를 각 시장별로 15개씩 추천했다.

2분기 실적호전 여부, 밸류에이션과 모멘텀, 업종모멘텀을 감안해 거래소 종목 중에서는 LG전자, LG, LG화학, 동양제철화학, 대림산업, 남해회학, 영원무역, 동원산업, 세아제강, 신라교역, 유니드, 동일산업, 한국카본, 휴스틸, 태경산업을 꼽았다.

코스닥 종목 중에는 무학, 한국알콜, 에버다임, 희림, 와이지-원, 하이록코리아, 한국선재, 평화정공, 삼현철강, 모아텍, 서호전기, 한단정보통신, 동양에스텍, 대동스틸, 케이비티가 뽑혔다.

삼성증권도 대안투자 테마 중 하나로 하반기 실적호전주를 권하고 해당 종목으로 동양제철화학, 삼성정밀화학, 세아베스틸, 한솔제지, KCC, 화인케미칼, 효성, LS, 유한양행, 한샘을 선정했다.

▲ 잘 막는 것도 실력이다  

지수 변동성이 클 때는 상대적으로 방어력이 높아 안정성을 보이는 종목도 눈여겨 볼만하다.

우리투자증권은 "지수의 추가하락 가능성이 높지 않지만, 마땅히 살 종목을 찾기 어려워 매매 위축으로 이어지고 있다"며 "주도주가 형성되지 못하는 시기에는 '믿음직한' 종목에 대한 관심이 높아지게 된다"고 설명했다.

가격 모멘텀과 밸류에이션 지표, 수급동향을 모두 감안해 방어력이 높은 투자유망주로 세아베스틸, 한국제지, 세아제강, 농심, 효성, 삼성SDI, 무림페이퍼, 현대모비스, 한라공조, LG화학을 추천했다.

▲ 잊지말자, 배당주

동부증권은 배당주를 선점하라고 조언했다.

강성원 연구원은 "재료에 따라 업종간 순환매가 수시로 일어나는 상황에서 투자자가 일일이 상황에 대처하는 것은 어려운 일"이라며 "고배당주에 선제적으로 투자함으로써 안정적인 배당수익을 확보하는 것이 좋은 전략이 될 수 있다"고 밝혔다.

지투알, S-Oil, 율촌화학, 진로발효, 고덴시, 동양이엔피, 상신브레이크, 화성산업, 리노공업, 대구은행이 안정적인 고배당을 기대할 수 있는 종목으로 선정됐다






I용어 전공 정리 DLL
 contents
정의; DLL 은 동적 연결 라이브러리라고 하며 여러 함수의 공유 라이브러리로 사용되는 실행 파일이다. 동적 링크를 이용하여 프로세스에서 해당 프로세스의 실행코드에 포함되어있지 않은 함수를 호출 할 수 있다.
함수의 실행코드는  dll에 있고 dll을 사용하는 프로세스와는 별도로 컴파일과 링크 및 저장을 하는 코드가 포함되어 있다. 이를 사용해서 데이터와 리소스를 쉽게 공유 할 수 있다. 여러 개의 응용프로그램이 메모리에 상주한 하나의 dll의 복사본 내용을 동시에 엑세스 할 수 있다

동적링크의 장점은 정적링크와 달리 런타임에 dll함수의 실행코드를 찾기 위해 필요한 정보만 실행 모듈에 포함 한다.
이를 통해 메모리 절약, 스와핑 감소, 디스크 공간 절약, 업그레이드 용이 등의 장점을 이끈다.
응용프로그램과 DLL의 차이점 공통점 : 모두 실행 가능한 프로그램 모듈이다.
다른점: 사용자가 직접 실행 가능한지의 여부

응용프로그램은 하나의 인스턴스외에도 여러 개가 실행 가능 하지만 DLL은 하나의 인스턴스만 실행된다.

응용프로그램은 스택, 전역메모리. 파일 핸들 및 메시지 큐  등이 포함될 수 있지만 DLL은 그렇지 않다.
DLL에 실행파일링크 암시적 링크와 명시적 링크
암시적 링크 : 라이브러리에 링크를 하고 실행파일이 로드될 때 운영체제가 DLL을 로드한다.클라이언트 실행 파일에서는 해당 실행 파일 내에 들어있는 함수를 호출 할 때와 마찬가지로 내보내기 함수를 호출 한다.

명시적 링크 : DLL사용 실행파일이 함수를 호출하여 DLL을 로드 및 언로드 하고 DLL의 내보내기 함수에 엑세스 한다.
클라이언트 실행 파일은 함수 포인터를 통해 함수를 호출 한다.

DLL초기화 DLL에는 해당 DLL이 로드될 때 실행되어야 하는 메모리 할당과 같은 초기화 코드가 있다. 초기화 위치는 빌드하는 DLL의 형식에 따라 다르다
초기화가 불필요한 경우: 초기화 및 종료 코드를 추가할 필요가 없을 때

기본 DLL: DLL 에 포함된 CWinApp 개체의 InitInstance 및 ExitInstance
-CWinApp 개체가 있기 때문에 응용프로그램과 같은 위치에서 초기화 한다.
★MFC 는 _DllManinCRTStartup 에서 PROCESS_ATTACH 및 PROCESS_DETACH에 대해 호출 되는 DllMain함수를 제공 하므로 DllMain함수를 작성하지 않는다.
MFC 에서 제공하는 DllMain 함수는 InitInstance로 로드 하고 ExitInstance로 언로드한다
확장 DLL : MFC DLL 마법사에 의해 생성 되는 DllManin
-기본 DLL에서 화장 DLL을 사용하려면 CDynLinkLibrary 개체를 만드는 초기화 함수를 내보내야 한다. 이함수는 확장 DLL을 사용하는 각각의 기본 DKK에서 호출 되어야 합니다. 이 초기화 함수는 확장 DLL의 내보내는 클래스 또는 함수를 사용하기 전에 기본 DLL에 포함된 CWinApp파생 개체의 InitInstance멤버 함수에서 호출 하는 것이 좋다.
비 MFC DLL : 사용자가 제공하는 DllMain 함수
-DLL소스코드 내에 DllMain이라는 함수가 있어야 한다.

<br />
이건 펀거<br />
<br />----------------------------------------------------------------------------------
DLL (Dynamic Link Library)이란,

   어플리케이션에서 동적으로 링크하여 사용할 수 있는 라이브러리를 말하며,
   확장자로는 .dll, .fon, .drv, .exe 등이 사용된다.

 장점으로는,
   일단, 여러 어플리케이션이 사용한다면 메모리 낭비를 줄일 수 있겠고,
   업그레이드및 모듈별관리가 용이한점을 들 수 있겠다.

 구조는,
   간단히 코드부분과 데이터로 구성되어있으며, 스택이 없다는 것이 특징이다.
    //스택은 어플이케이션의 것을 사용한다
      스택이 없으므로 독립적인 프로세스가 될 수 없으며
      운영체제로 부터의 메세지를 받을 수 없다
   내부에 Exported Function Table을 가지고 있으며,
    서수 + 기호이름 + 실제함수를 가리키는 포인터로 구성되어 있다.

   (MSDN-TechnicalArticles-VisualTools-VisualC++-Visual C++4.0- DLLs for Beginners 참조)

 종류는,
   - Regular DLL (Statically linked MFC DLL) : 배포시 자신의 DLL만 제공가능
   - Regular DLL (using Shared MFC DLL)    : 배포시 자신의 DLL과 MFC공유DLL을 같이 제공
      -> 어플리케이션이 MFC이외의 경우에도 사용가능
           C언어 기반의 인터페이스제공 필요.
   - MFC Extension DLL (using Shared MFC DLL) : MFC로 작성된 어플리케이션에서만 사용가능

 링킹방법으로는,
   - Implicit Linking (암시적링킹)
     - DLL + Lib + header file 필요.
     - 어플리케이션 로딩때 같이 로딩.
   - Explicit Linking (명시적링킹)
     - 로딩타임 마음대로 결정가능 ( 예: 영문리소스/한글리소스 동적으로 결정 )
     - 주요함수
        - LoadLibrary : DLL모듈 로딩
        - GetProcAddress : 함수의 포인터를 얻어옴
        - FreeLibrary : DLL 종료 (reference counter를 1감소시킨다)

 컴파일러 커맨드
   - _WINDLL : 현재 프로젝트가 DLL임을 의미
   - _USRDLL : Regular DLL임을 의미
   - _AFXDLL : using Shared MFC DLL 임을 의미
   - _AFXEXT : MFC Extension DLL임을 의미

 일반적인 익스포트함수 예제

  extern "C" declspec(dllexport) void WINAPI function(void);
   // extern "C" : 컴파일때 decoration name을 생성하지 않도록 하기위해 (C-Style)
   // declspec(dllexport/dllimport) : Export/Import된 함수임을 의미
   // WINAPI
      - "windef.h"의 119 line 에 _stdcall 로 정의되어 있음
      - PASCAL calling convension을 의미 : push는 거꾸로(오른쪽에서 왼쪽), pop은 Callee가 담당.
      - 참고로, C++은 디폴트로 _cdecl을 사용 : push는 거꾸로(오른쪽에서 왼쪽), pop은 Caller가 담당.

 DLL 찾기 순서
   1 어플리케이션(EXE)을 포함한 폴더
   2 프로세스의 현재 폴더
   3 시스템 폴더
   4 윈도우즈 폴더
   5 Path에 지정되어 있는 폴더들...

 
 TIPs

 1. DLL에 공유데이터를 포함시키기 위한 방법

   - memory-mapped file을 사용하는 방법. (요건 나중에...)
  
   - named data section을 사용하는 방법.

     #pragma data_seg ("Shared")
     int iShared = 0;
     #pragma data_seg ()


 2. DLL내에 있는 Resource 참조 방법

   - 가장 일반적인 MFC 어플리케이션 + MFC Extension DLL 의 경우 리소스를 찾는 순서

     1. 어플리케이션(EXE)의 리소스 검색
     2. DLL의 리소스 검색
     3. MFC공유DLL의 리소스 검색
         -> 중복되는 리소스이름이 있는 경우는 먼저 찾아진 리소스를 사용하게 된다.
              임의로 찾기 순서를 바꾸기 위해서
              AfxSetResourceHandle(원하는 모듈의 리소스핸들)을 사용할 수 있다.
              예) 다음의 코드는 DLL내에 있는 리소스를 먼저 찾기 위한 코드이다.
              // DLL의 코드
              Handle hInstOld = AfxGetResourceHandle();  // 어플리케이션의 리소스핸들을 보관.
              AfxSetResourceHandle(DLL의 DllMain에서 얻은 DLL의 리소스핸들);
              // ...
              AfxSetResourceHandle(hInstOld); // 원래대로 복귀

   - MFC 어플리케이션(or 델파이/비베...) + Regular DLL 의 경우.

      - Regular DLL을 사용하는 경우에는 위와같이 DLL내의 리소스를 참조할 수 없다.
        따라서 DLL내의 리소스(다이얼로그와같은)를 참조하기 위해서는,
        다음과 같이 임의로 Module State를 전환시켜주는 함수가 필요하다.
      - AFX_MANAGE_STATE(AfxGetStaticModuleState());
        일반적으로 프로세스(EXE)의 인스턴스핸들은 거의 항상 0x00400000이고,
        DLL은 0x10000000 이다.
        DLL내에서 위의 함수를 사용한 후에는 인스턴스핸들이 DLL의 인스턴스핸들(0x10000000)로
        바뀐 것을 확인해 볼 수 있을것이다.

   - (어플리케이션 + ) Regular DLL + MFC Extension DLL

      - Regular DLL에서 MFC Extension DLL내에 있는 리소스를 참조하려 할때 역시
        그냥 되지는 않는다. 이때는 두가지 방법이 있는데,
 
        첫번째는,

        잠시 리소스를 참조하기 위해 사용되는 인스턴스핸들을 MFC Extension DLL의 것으로
        바꿨다가 복구해주는 방법이다.

        HINSTANCE hInstOld = AfxGetResourceHandle();
        AfxSetResourceHandle(g_hModule);
        m_menu.LoadMenu(IDR_LISTOUTPUT)
        AfxSetResourceHandle(hInstOld); // restore the old resource chain

        이 방법은 위의 리소스찾기 순서를 바꾸기 위해 사용했던 방법과 같다.
        g_hModule은 DLLMain에 있던 hInstance를 전역변수로 보관한 것이다.

        두번째는,

        아래 소스는 MFC Extension DLL을 만들었을 때 만들어지는 소스의 일부이다.
        잘 보고 가장 긴 주석문에서 시키는 대로 하면된다.

        new CDynLinkLibrary(Implicit_MFCExt_dllDLL); 를 주석처리하고,
        따로 함수를 만들어 익스포트 시킨다.
        그리고, 그 함수를 Regular DLL의 InitInstance와 같은 함수에서
        첨에 한번 초기화를 시키도록 해 주면 된다.
        그러면 Regular DLL의 리소스체인에 attach된다.
 
        extern "C" int APIENTRY
        DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
        {
            // Remove this if you use lpReserved
            UNREFERENCED_PARAMETER(lpReserved);

            if (dwReason == DLL_PROCESS_ATTACH)
            {
                TRACE0("IMPLICIT_MFCEXT_DLL.DLL Initializing!\n");

                // Extension DLL one-time initialization
                if (!AfxInitExtensionModule(Implicit_MFCExt_dllDLL, hInstance))
                    return 0;

                // Insert this DLL into the resource chain
                // NOTE: If this Extension DLL is being implicitly linked to by
                //  an MFC Regular DLL (such as an ActiveX Control)
                //  instead of an MFC application, then you will want to
                //  remove this line from DllMain and put it in a separate
                //  function exported from this Extension DLL.  The Regular DLL
                //  that uses this Extension DLL should then explicitly call that
                //  function to initialize this Extension DLL.  Otherwise,
                //  the CDynLinkLibrary object will not be attached to the
                //  Regular DLL's resource chain, and serious problems will
                //  result.

                //new CDynLinkLibrary(Implicit_MFCExt_dllDLL);

                g_hModuleInstance = hInstance;
            }
            else if (dwReason == DLL_PROCESS_DETACH)
            {
                TRACE0("IMPLICIT_MFCEXT_DLL.DLL Terminating!\n");
                // Terminate the library before destructors are called
                AfxTermExtensionModule(Implicit_MFCExt_dllDLL);
            }
            return 1;   // ok
        }

        extern "C" AFX_EXT_API void WINAPI InitMFCExtDLL()
        {
            // create a new CDynLinkLibrary for this app
            new CDynLinkLibrary(Implicit_MFCExt_dllDLL);
        }