반응형

DLL Win32


[In-Process 방식]
내가 System part에 속하지 않아서 Process model을 설계하는 것에 대해 그다지 관심을 두지 않고 있지만,
지금 System 팀에서 아직 Process model의 architecture 를 설계 방향을 잡지 못하고 있다.
음, 아무래도 DLL 과 COM 의 구현 등에 대해서 래퍼런스가 될만한 프로세스 모델을 찾고,
좀더 정확하게 DLL의 동작및 메모리 구조 등에 대해서 더 공부를 해봐야 할듯하다.


- DLL Win32 의 경우 해당 DLL이 로드된 물리적인 메모리 영역이 해당 DLL을 로드한 어플리케이션의 프로세스 주소 영역게 메핑된다. 즉, Win32 DLL 은 자신을 로드한 어플리케이션의 일부가 된다.
따라서 DLL 함수의 매개변수에 포인터가 넘어올때 DLL함수가 이 포인터를 통하여 접근할 수 있는 주소 영역을 완전히 유효하다.


http://msdn.microsoft.com/en-us/library/ms686958(VS.85).aspx
Using Shared Memory in a Dynamic-Link Library

The following example demonstrates how the DLL entry-point function can use a file-mapping object to set up memory that can be shared by processes that load the DLL. The shared DLL memory persists only as long as the DLL is loaded. Applications can use the SetSharedMem and GetSharedMem functions to access the shared memory.

DLL that Implements the Shared Memory

The example uses file mapping to map a block of named shared memory into the virtual address space of each process that loads the DLL. To do this, the entry-point function must:

  1. Call the CreateFileMapping function to get a handle to a file-mapping object. The first process that loads the DLL creates the file-mapping object. Subsequent processes open a handle to the existing object. For more information, see Creating a File-Mapping Object.
  2. Call the MapViewOfFile function to map a view into the virtual address space. This enables the process to access the shared memory. For more information, see Creating a File View.

Note that while you can specify default security attributes by passing in a NULL value for the lpAttributes parameter of CreateFileMapping, you may choose to use a SECURITY_ATTRIBUTES structure to provide additional security.


[MSDN 참고 내용]

Visual C++
DLL의 데이터를 응용 프로그램 또는 다른 DLL과 공유하려면 어떻게 합니까?

Win32 DLL은 호출 프로세스의 주소 공간에 매핑됩니다. 기본적으로 DLL을 사용하는 각 프로세스에는 모든 DLL의 전역 및 정적 변수에 대한 자체 인스턴스가 있습니다. DLL이 다른 응용 프로그램이 로드한 DLL의 다른 인스턴스와 데이터를 공유해야 할 경우 다음 방법 중 하나를 사용할 수 있습니다.

  • data_seg pragma를 사용하여 명명된 데이터 섹션을 만듭니다.

  • 메모리 매핑 파일을 사용합니다. 메모리 매핑 파일에 대한 Win32 설명서를 참조하십시오.

다음은 data_seg pragma 사용 예입니다.

#pragma data_seg (".myseg")
   int i = 0; 
   char a[32]n = "hello world";
#pragma data_seg()

data_seg를 사용하여 새로운 명명된 섹션(이 예제에서는 .myseg)을 만들 수 있습니다. 일반적인 사용 방법은 명확하게 데이터 세그먼트 .shared를 호출하는 것입니다. /SECTION:.MYSEC,RWS 링커 옵션을 사용하거나 .def 파일의 새로운 명명된 데이터 섹션에 대해 올바른 공유 특성을 지정해야 합니다.

공유 데이터 세그먼트를 사용하기 전에 몇 가지 제한 사항을 고려해야 합니다.

  • 공유 데이터 세그먼트의 변수는 정적으로 초기화되어야 합니다. 위의 예제에서 i는 0으로 초기화되며 a는 hello world로 초기화된 32문자입니다.

  • 모든 공유 변수는 지정된 데이터 세그먼트의 컴파일된 DLL에 있어야 합니다. 배열이 크면 DLL도 커집니다. 초기화된 모든 전역 변수에 대해 해당됩니다.

  • 프로세스 관련 정보를 공유 데이터 세그먼트에 저장하지 마십시오. 대부분의 Win32 데이터 구조나 값(예: HANDLE)은 단일 프로세스의 컨텍스트 내에서만 유효합니다.

  • 각 프로세스는 자체 주소 공간을 얻습니다. 공유 데이터 세그먼트에 포함된 변수에는 포인터가 저장되지 않는다는 점에 주목할 필요가 있습니다. 포인터는 한 응용 프로그램에서는 절대적으로 유효하지만 다른 응용 프로그램에서는 그렇지 않습니다.

  • 각 프로세스의 가상 주소 공간 내의 다른 주소로 DLL 자체가 로드될 수 있습니다. DLL이나 다른 공유 변수에서 함수에 대한 포인터를 사용하는 것은 안전하지 않습니다.

뒤의 세 가지 항목은 메모리 매핑된 파일 및 공유 데이터 세그먼트에 적용됩니다.

메모리 매핑된 파일의 시작 위치를 알 수 없으므로 메모리 매핑된 파일이 공유 데이터 섹션보다 유용합니다. 개발자는 공유 메모리 내부에 있는 모든 데이터에서 "공유 메모리 섹션의 시작 위치를 기준으로 하는 오프셋"을 사용하여 포인터와 유사한 동작을 구현할 수 있습니다. 빠르고도 간편한 작업을 위해 __based 포인터가 강력히 권장됩니다. 그러나 기준(또는 메모리 매핑된 파일의 시작 위치)은 각 프로세스마다 달라질 수 있으므로 __based 포인터의 기준을 저장하는 변수 자체는 공유 메모리에 있을 수 없습니다.

이러한 제한이 C++ 클래스에서는 중요한 의미를 갖습니다.

  • 가상 함수를 사용하는 클래스에는 항상 함수 포인터가 있습니다. 가상 함수를 사용하는 함수는 공유 데이터 세그먼트에 저장될 수 없으며 메모리 매핑된 파일에도 저장될 수 없습니다. 이 점은 MFC 클래스나 MFC에서 상속된 클래스에게 중요합니다.

  • 통계 데이터 멤버는 전역 변수와 동등한 변수로 구현됩니다. 따라서 각 프로세스에는 해당 클래스의 정적 데이터 멤버에 대한 자체 복사본이 있습니다. 정적 데이터 멤버를 사용하는 클래스는 공유될 수 없습니다.

  • 공유 데이터 세그먼트의 초기화 요구 사항으로 인해 C++ 클래스에서 특별한 문제가 제기됩니다. 공유 데이터 세그먼트에 CTest Counter(0); 같은 문이 있으면 Counter 개체는 DLL을 로드하는 각 프로세스에서 초기화되어 매번 개체 데이터가 0으로 됩니다. 링커가 DLL을 만들 때 초기화하는 내장 데이터 형식과는 다릅니다.

이러한 제한 때문에 프로세스 간에 C++ 개체를 공유하는 것은 바람직하지 않습니다. 일반적으로 C++를 사용하여 프로세스 간에 데이터를 공유하려면, 데이터를 공유하기 위해 내부적으로 메모리 매핑된 파일을 사용하는 클래스를 작성하되 클래스 인스턴스는 공유하지 마십시오. 이런 클래스를 개발할 때는 신중해야 하지만 이런 방식으로 응용 프로그램 개발자는 데이터 공유에 의한 부작용을 완벽하게 제어할 수 있습니다.

명명된 데이터 섹션을 만드는 방법에 대한 자세한 내용은 http://support.microsoft.com의 기술 자료 문서를 참조하십시오.

  • "How to Share Data Between Different Mappings of a DLL"(Q125677)

  • "Specifying Shared and Nonshared Data in a DLL"(Q100634)

  • "Sharing All Data in a DLL"(Q109619)

  • "Memory in Shared Code Sections Is Not Shared Across Terminal Server Sessions"(Q251045)


반응형

[레이몬드 첸의 윈도우 개발 282 스토리 ]
the old new thing: Practical Development Throughout the Evolution of Windows


Inhouse 방식의 Platform을 Open platform으로 변경하는 프로젝트를 진행하려면, 여러가지 고려해야 할 사항들이 많겠죠?

이런 저런 자료들을 찾다 우연찮게 "윈도우 개발 282 스토리" 라는 책을 보게 되었습니다.

순전히 우연히 서점가서 발견한거임 ㅡㅡ;; 참 운도 좋지!!

안그래도 요즘 "아!!! 도대체 상용 플랫폼을 개발한 사람들은 뭘 어떻게 개발 했을까?" 하는 고민 중이었는데 이런 책을 구하게 되어 내용을 살펴보면서 "그렇지!!!","그래 맞아" 요런 공감대 어린 감탄사들을 연발하고 있습니다.


어떤 내용이 주인지 궁금하다구요???  "사서 보세요~"
그래도 이렇게 오늘의 블로그 페이지를 마무리 하면 아쉬우니까 몇가지 간단한 소개를 해 드리죠!!


컴퓨터를 끄기 위해 왜 시작 버튼을 눌러야만 하는가?  --> 시작 버튼의 유래와 유용성 설명
    초창기 Window95가 나왔을때는 '시작' 버튼이 없고 system 이라는 이름의 메뉴 버튼으로 이뤄 졌었는데, 사용자들은 테스트 결과 부팅후에 뭘해야 할지 모르는 사용자들이 대부분 이었다는 것입니다.
그때 누군가가 System 메뉴 버튼에 "시작" 이라는 이름을 붙이자라고 제안하했고, 이 '시작'이라는 문구가 유용성 테스트 결과를 극적으로 개선한 케이스가 되었다고 합니다.
모든 대화상자에서 기본 응답은 '취소' 이다.  --> 사용자는 결국 취소를 선택한다는 내용
대화상자의 목적은 S/W가 판단하기 힘든 경우 사용자에게 정확한 답변을 받기 위해서 사용하였는데 ,
문제는 사용자에게 어려운 질문이나 전문적인 용어의 dialog화면을 보여주면 사용자는 잠시 그 화면을 쳐다보다가 원래 그화면이 뜨기 전으로 돌려놓으려고 한다는 것을 희화했다.
GlobalAlloc 함수의 이력
UI 모달성과 코드 모달성   --> Modal 구현과 관련된 히스토리와 기술 설명
WHQL 드라이버 인증 절차 속이기 --> driver 개발자들의 만행(?)에 대한 에피소드
과거 호환성
유니코드
다중모니터 지원--> 다중 모니터를 지원하게 된 계기



반응형

오늘에 할일!!!! 쩝..

 

List에 대해서 알아보기..
하도 오래전에 써보고 최근에 써본적이 없는 내용이라 ... 기억이 가물가물해서
다시한번 여기저기 찾아보고 기록해 봐야지!!!.!!

 

요 페이지가 몇일만에 업데이트 될까낭?



-2008/11/17



-진짜로 업뎃이 안되네 ㅎㅎㅎ

- 2009/10/12
 좀 지난 사안이었지만, STL Open source 쪽에서 솔루션을 찾아서 써보기로 결정했다.



반응형



아...

요즘 나에게 떨어지는 개발 업무가 코딩 보다는 생각을 해야 하는 일이 점점 더 많아지는듯해!!

 

어떻게 개발해나가야 할까 Control과 View를 분리 해야지!!

근데 요렇게 요렇게..

 

좋아 분리는 다 했으니 밑에 있는 똘똘이한테 시켜야지..

 

근데.. 요렇게 하는게 앞으로 관리상 편의를 가져다줄까?

 

기존 코드들 이런 구조로 바꿀려면 다 뒤집힐텐데... 흠.. 반발은 없을라나....

 

.... 요런게 내 머리속에서 왔다리 갔다리..

 

점점더 뭔가를 결정내리기 어려워저가지!!!

 

코딩에만 전념하던때가 단순하고 편했던것 같아.~~



개발자 넉두리 같은 일기가 되어버렸네...


-2008/11/24

반응형

요즘 주 업무가 설계 및 리뷰. 그리고 현재 architecture 및 디팩 유형을 분석하여 아키텍쳐를 새로 정립하는 일이 주다.

 

아키텍쳐 라는게 정답이 없다보니, 이렇게 계획하면 다른쪽에 작업량이 많아지고, 너무 많은 부분을 새로 디자인 하면 S/W 전반적으로 흐름이 바뀌게 되고.. 고민거리가 늘어나네..

 

딱 맞아 떨어지는 일이 아니고 더군다나 팀원들의 업무와도 엮겨서 자주 흔들면 그만큼 눈총을 받으니 에휴~~.

 

하지만!!! 즐겁다!! ㅎㅎ... 새로운 영역에 들어선 기분이랄까...

 

코딩에서 아키텍팅으로 ... 더군다나 이전에 설계및 개발을 해봤던 시스템들은 상당히 규모가 작고 내부 개발용 시스템이었지만 지금 진행하는것은 open platform 이다 보니.. 더 두근두근 하다.



2008/12/03

'개발 Note > UI Framework 개발하기' 카테고리의 다른 글

STL : List  (0) 2009.01.04
Coding  (0) 2009.01.04
회사 일? 내 일? 그리고 블로그  (0) 2009.01.04
새로운 시작!!! framework  (0) 2008.12.29
오늘 읽은 "프레임워크 개발의 이해와 시작"  (0) 2008.12.19
반응형

내가 하는 일들과 해야할일 그리고 관심있는 부분들을 블로그에서 작업하려 하다보니 맘대로 안되는 부분들이 많은 걸 알게 되었다.

가장 큰 부분이 회사에서 하는 일을 개인 블로그에 올릴수 있는가 하는 예기이다.!

참 민감한 부분이기도 하다고 생각되는데.... 

단도직입적으로 과연 회사에서 배운 지식과 정보들이 어디까지가 개인의 것이 될 수 있을까?

유재석이 놀러와 작가가 써준 원고의 내용과 자기 계약상의 내용을 블로그에 올려서 여러 사람들과 공유하고 있다면 어떨까?

 
과연 원고가 저작권법에 걸릴까?
아니면 계약서가 에이전트의 영업 비밀 보장 계약에 문제가 될까?

음... 둘다 걸릴거 같군요.. ㅡㅡ;;;


그러면 유재석이 그동안 여러 프로그램을 진행하면서 익힌 노하우나 개그, 그리고 개인기 등을 
블로그에 올리는것은 문제가 될까?

글쎄???~~~~@@@!!!######  

아리까리 하네요.


떡진 머리를 한 프로그래머가 게시판에 자신이 코딩 하고 있는 부분에서 영 꽉꽉 막힌 버그가 있는데 다른 개발자들도 이런 문제를 가지고 있는지 묻고 예기 하고 싶을 때 어떻게 해야 할까?

참으로 안타까운 부분이지만 구체적으로 어떤 부분이 꽉 막히는지 "콕!"찝어서 예기 하지 못하고, 모듈 인터페이스를 COM 으로 사용하고 있는데 COM instance 가 계속 구 버젼으로 동작해요!! 
이런 식으로 돌려서 예기 할수밖에 없으니 대답해주는 사람도 돌려서 물어본 질문에 대해서 추측해서 대답해줘야 하니... 답답할 노릇이죠!!!

그리고 개발자는 떡진 머리를 한 채 몇시간을 더 보내다가 결국 자기  PC를 끄고 머리좀 식히고 잠도 좀 자고 일어나서 어제 문제를 마저 해결하려고 컴을 켰더니 문제가 해결되었네요.!!

다행히도 앞으로 몇일간은 이 프로그래머는 머리가 떡질 일이 없을 지도 모릅니다.

하지만 문제는 이런 일은 언제나 있다는 것이죠!!!

과연 개발자 포럼이나 이런곳에서 어느정도 까지 정보가 공유될 수 있을까? 정확히 말하면 회사에서 개발하고 있는 프로젝트의 정보가 맞겠지만...

어찌되었건 지금의 개발자들이 안고 가야 하는 부분이기도 하죠!!..

개발자들의 입장에서는 그렇게 대단치도 않다고 생각하되는 부분이지만 다른 상황에서 바라본다면 매우 골치 아픈 문제들이 있는 것입니다.

예를 들면,,, 자동차 영업사원인 뺀질한 금자씨가 영업에도 활용할겸 블로그를 운영하고 있는데 , 피서철을 앞둔 6월자신이 판매한 차량 대수가 140대가 넘게 되어 자랑 할겸 , 블로그에 올렸습니다.

"나 이번달 140대 팔았다" 리고 말이죠!. 그러면서 자기 영업소 직원들 평균 판매 대수가 40대인데 이건 엄청난 숫자라고 예기 했다고 합시다.

별 문제 안되어 보이는 글이지만, 이미 경쟁사에게 6월달 해당 영업소의 판매실적을 공개한 것이나 다름없는 결과를 낳을 것입니다. 


하지만 어떤 화장품 업체의 연구소에서 근무하는 이준기씨가 새로 블로그를 운영하게 되면서 
자신이 몇년전에 개발했던 "아조아!" 로션개발 당시, 아토피성 피부 트러블을 해결하기 위해 실행했던 실험 방법들을 소개했다면 이는 문제라고 보기 힘들어 질 것 같습니다!!! 그렇죠???


결국!!! S/W 개발자들이 공유 할 수 있는 것은 "문제 해결 방법" 이나 "개발중인 코드"가 아니라 "문제 해결 방법을 찾는 방법"이나 "framework ,API, solution"등의 올바른 사용방법이 되겠죠?

물론 자신의 Idea는 누가 뭐라 하겠습니까?



'개발 Note > UI Framework 개발하기' 카테고리의 다른 글

STL : List  (0) 2009.01.04
Coding  (0) 2009.01.04
아키텍쳐를 잡아 나가는 일  (0) 2009.01.04
새로운 시작!!! framework  (0) 2008.12.29
오늘 읽은 "프레임워크 개발의 이해와 시작"  (0) 2008.12.19
반응형

Mobile 쪽에 몸담고 있으면서 , file system에서 부터 UI 까지 모든 과정에 참여하여 아이디어를 내고 개발하고 결과를 보고 아키텍쳐를 수정하여 다시 설계하고 하는 작업들이 즐거웠던 시절이 있었다.

하지만, 이런 점진적인 발전과 시행착오들은 점점 부담과 위기로 다가오기 시작한 것 같다.

Hand Phone S/W의 시장에 존재하던 Normal phone 과 smart phone의 경계가 무너지면서 기존에 Normal Phone S/W들이 Open OS와의 경쟁을 시작하게 되었기 때문이다.

최근 내가 지금 관심을 가지고 지켜보고 있는 기존 Embeded S/W의 경쟁력에 관한 부분이다.
우선 첫번째가 "Embeded S/W가 Open OS 들과 경쟁하기 위해 어느정도 개선되어야 하는가" 하는 부분이고,
두번째는 "Embeded S/W가 Open OS들만큼의 기능을 갖추는 것이 과연 메리트가 있는가" 하는 부분이다.
세번째는 "시장의 Needs는 이미 Open OS의 기능을 요구 하기 때문에 최대한 빠르게 Open OS 로 전환하는 것이 옳은가" 하는 것이다.

Open OS( Window Mobile이나 Linux , Symbian 등)의 포팅이나 개발 업무 보다는 기존에 꾸준히 Embeded S/W만 해왔기 때문에 Embeded S/W 쪽으로 훨씬 애착을 가지고 있는 편이다. 그럼에도 불구하고 Embeded S/W 냐 Open OS냐를 두고 고민하는 것은 10년 20년이 지나면 Open OS로 달려가고 있을것으로 예상 하기 때문이다.

여기에도 한가지 변수가 있는데 기존의 Window mobile, embeded linux, OSX, Symbian 등과 어깨를 나란히 할 수 있는 Open OS를 만들어 내고 배포할 수 있는가 하는 것이다.

개인적인 입장에서는 내가 지금 하고 있는 프로젝트가 이런 Open OS 개발의 가능성을 열고, 기업입장에서도 투자가치가 충분한 부분이라 인식되었으면 하는 바램이다.!!



'개발 Note > UI Framework 개발하기' 카테고리의 다른 글

STL : List  (0) 2009.01.04
Coding  (0) 2009.01.04
아키텍쳐를 잡아 나가는 일  (0) 2009.01.04
회사 일? 내 일? 그리고 블로그  (0) 2009.01.04
오늘 읽은 "프레임워크 개발의 이해와 시작"  (0) 2008.12.19
반응형

글을 읽는 도중 다음과 같은 문구를 보게 되었습니다.
Framework 없이 어플리케이션을 만드는 것은 프로그래머의 역량과 컨디션에 따라 어플리케이션의 구조가 만들어지게 된다. 라고 적혀있었는데 생각해보면 맞는 예기인것 같습니다.

Framework이라는 것이 사실상 생산성을 높이고 제공하고자 하는 기능을 구조화 하여, 개발자들에게 기능 사용구현에 대한 Guide 역할하고, 기능 동작을 보장 해주는 것이라 볼수 있습니다.

때문에 Framework없이 S/W를 개발한다면 사실상 개발자의 역량에 맡길수 밖에 없게 됩니다.

이전에 이와 같은 기능을 구현해 봤는가, 아닌가에 따라 S/W의 질이 달라지게 되겠죠.

Framework이란 무엇인가? 

 Ralph Johnson 이라는 사람은 추상클레스( abstract class) 들의 집합과 상호 협조하는 클래스들의 인스턴스 동작 방법으로 이루어진 재사용 가능한 디자인이라 정의했습니다.

프로젝트에 어울리는 잘만들어진 프레임워크를 이용한 어플리케이션은 비록 거대해 지더라도 프레임워크의 의도에 맞게 어플리케이션의 설계가 이루어집니다. 때문에 어플리케이션에 의해 System의 안정성을 해치거나, 터무니없이 낮은 퍼포먼스를 내는 일은 거의 없을 것입니다.

라이브러리와 프레임워크의 차이!
라이브러리는 개별적인 기능들을 집단형태로 묶음을 의미합니다.
때문에 라이브러리를 이용해 문제를 해결하고자 할때는 메소드의 기능을 정확히 이해하고 사용해야 합니다..

프레임워크는 원하는 기능을 제공하는 모듈의 인스턴스와 이에 수반되는 여러가지 장치 들의 상호작용까지의 묶어서 정의 하게 됩니다. 

때문에 프레임워크에서 제공되는 기능을 사용하게 되면 이와 수반된 이미 검증된 작업의 플로우까지 함께 사용하게 되는 것입니다..


이렇게 함으로 해서 어플리케이션의 코드를 줄일 수 있고, 안정성을 높이며 개발 속도를  빠르게 할 수 있습니다.



좋은 프레임워크
좋은 프레임워크를 사용하면 소프트웨어 개발 비용이 줄어들지만, 아이러니하게 좋은 프레임워크를 개발하기 위한 비용이 많이 들게 됩니다.

좋은 framework을 만들기 위해 설계에 들어가는 시간, 퍼포먼스 향상을 위해 투자하는 시간, 그리고 안정성 확보를 위해 테스트에 들어가는 시간 이 모든 것들이 비용이 되기 때문에 많이 들 수 밖에 없습니다.


Framework 설계에 들어가는 원칙들.

의존관계 역전 원칙( The Dependency Inversion principle)
인터페이스 분리 원칙(The Interface Segregation Principle)
리스코프 치환 원칙(The Liskov Substraction Principle)
단일 책임 원칙(The Single Responsiblity Principle)
개방 폐쇄 원칙(The Open-closed Principle)


프레임워크는 많은 도메인에서 여러가지 문제를 해결할 수 있도록 만들어지기 때문에 특정 도메인의 간단한 문제를 해결하기 위해 기능과 구현이 복잡해지고 코드의 크기나 객체의 크기가 커질 수도 있다.



'개발 Note > UI Framework 개발하기' 카테고리의 다른 글

STL : List  (0) 2009.01.04
Coding  (0) 2009.01.04
아키텍쳐를 잡아 나가는 일  (0) 2009.01.04
회사 일? 내 일? 그리고 블로그  (0) 2009.01.04
새로운 시작!!! framework  (0) 2008.12.29

+ Recent posts