alones.kr/blog로 사이트 이전했습니다. 관련 공지

Alones world : Location : Tag : GuestBooks : Admin : New Article : Alones Wiki : Joinc TeamBlog
Alones world 블로그에 오신것을 환영해요^^
gidaeyeo@gmail.com
175
238
353112

Add to Google Reader or Homepage

 Subscribe in a reader

현재 접속 자 수
hit counters
------------
Recently Popular Posts
------------
'dll'에 해당되는 글 6건

다음과 같은 function이 dll에서 export되었다면

void __declspec(dllexport) MakeList(std::list<CMyClass>& list); //문제 1

사용 후 caller의 stack이 pop-up되는 경우나 caller가 list.clear()를 호출 할 때 access viloation이 발생한다.

-_-; STL 자체를 DLL의 export symbol에 사용하는 것 자체가 많의 주의를 요하는 것 같다.

아무튼 원인은 (짧은 영어로 후다닥 읽어 보고 예전의 경험을 + 하면)
STL의 대부분의 class들을 static member를 직/간접적으로 사용하고 있으며 이 것은 dll (또는 exe) 내부에서 instance들이 생성될 때 static memeber들을 가지게 되는 것을 의미하고,
그로 인해 static member들 간의 sync.가 맞지 않아서 access viloation이 발생한다는 것이다.

문제 1의 경우 caller (out of dll)와 caller (in dll)의 list instance 들의 static member (in STL)의 sync.가 맞지 않아서 문제가 생기는 것 같다. (debuging을 해보면 list를 caller가 clear할 때 발생한다.

아무튼 해결책은 -_-;; std::list<CMyClass>&를 parameter로 사용하지 않고 void* linked list (자체 제작한) 을 사용해서 해결하기는 했다.

Ref. 1
나와 같이 괴로워하는 이들의 이야기들..

http://groups.google.com/group/microsoft.public.vc.stl/browse_thread/thread/564afc6a5165d491/b6cf53cca8faf380?lnk=st&q=std%3A%3Alist+dll&rnum=1#b6cf53cca8faf380

 

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/64d765d938d54e41/232656931d97381c?lnk=st&q=std%3A%3Alist+dll&rnum=47#232656931d97381c

 



Ref. 2

STL의 대부분의 class static data member를 직,간접적으로 사용하기 때문에 dll 내부의 static data memberdll 외부 caller static member sync.가 맞지 않아서 access violation이 발생할 수 있다.

Wrapper function을 두어서 간접적으로 STL instance에 접근

http://support.microsoft.com/kb/q172396/



Ref3.

마지막 답변에 2003, 2005에서 STL containers export 있는 macro set 있다.

http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_thread/thread/9bd528743dc33b5b/2113341536248818?lnk=st&q=std%3A%3Alist+dll&rnum=11#2113341536248818


Ref4.

다음 주제에 대해서 다루고 있다.

Export an instantiation of a Standard Template Library (STL) class.

Export a class that contains a data member that is an STL object.

http://support.microsoft.com/kb/q168958/

How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object




ref in this blog
DLL내에서 STL을 사용했을 때 발생하는 warning에 대해서
http://alones.byus.net/tt/entry/tempSTL을-DLL에서-썼을-때의-문제-점
크리에이티브 커먼즈 라이센스
Creative Commons License
Trackback 0 : Comment 10
http://alones.byus.net/tt/trackback/560
From. BlogIcon say it again 2008/03/13 06:38Delete / ModifyReply
좋은 위치는 그것 찾아본 즐겼다!
From. BlogIcon hot anime game online 2008/03/13 07:30Delete / ModifyReply
위치에 중대한 일은 그것을 좋아했다!
From. BlogIcon backup software tape 2008/03/13 08:22Delete / ModifyReply
친구는 너의 위치의 현재 팬이 되었다!
From. BlogIcon behavior dog issue 2008/03/14 03:16Delete / ModifyReply
중대하고 유용한 위치!
From. BlogIcon example lady limericks young 2008/03/14 03:17Delete / ModifyReply
아주 재미있는 지점. 감사.
From. BlogIcon furry hentai 2008/03/14 04:05Delete / ModifyReply
나의 친구는 너의 위치의 현재 팬이 되었다!
From. BlogIcon mistress teazer 2008/05/23 04:37Delete / ModifyReply
위치에 그것을 중대한 일은 좋아했다!
From. BlogIcon penile implant photo 2008/05/23 05:02Delete / ModifyReply
친구는 너의 현재 위치의 팬이 되었다!
From. BlogIcon new sex positions 2008/05/23 05:15Delete / ModifyReply
중대하고 유용한 위치!
From. BlogIcon roseanne s mom on roseanne 2008/05/24 04:02Delete / ModifyReply
너는 아주 보는 좋은 위치가 있는다!

STL (std::string, std::vector, etc)등을 DLL의 class에서 (public이든, private이든) 사용할 경우 template으로 인해 warning이 발생한다. (C4251)

아래와 같은 코드로 std::vector에 대해서는 warning을 제거할 수 있지만,

DLLEXPORT_TEMPLATE template class DLLEXPORT_API std::vector<char>;

그외 container에 대해서는 적용되지 않는다.

아래 site에 그 내용이 있고 link를 열면 관련 내용에 대한 pdf를 볼 수 있다.





Ref: http://lbjcom.net/entry/C4251-경고-메시지

C4251 경고는 "... needs to have dll-interface to be used by clients of class ..." 와 같은 경고 메시지를 내는데, STL을 DLL에서 사용할때 주로 나오는 경고 메시지입니다. 관련된 MSDN링크는 여기(관련된 MSDN 링크) 이고, 이럴 경우 DLL내부에서만 사용하는 경우는 문제가 없다고 합니다.
(관련 문서 : http://www.hanbitbook.co.kr/web/sample/1296/cpp_stl_appendix.pdf)
해결 방법 또한 위 링크에 나와 있고 단순한 경고이기 때문에 그냥 사용해도 문제가 없을듯...단 경고 메시지가 보기 싫으면 헤더 파일에
#pragma warning(disable: 4251)
를 추가해 주면 됩니다.
이전에 STL을 DLL에 썼는데, DLL 외부에서 STL인 멤버에 접근을 할려고 하면 에러를 냈었는데, 아마 이 경고와 관련이 있는듯 합니다. DLL내부의 STL 인스턴스에 접근을 직접은 못하고 카피를 해줘야 할듯@.@a

혹시 다른 방법 있나요?=_=a
크리에이티브 커먼즈 라이센스
Creative Commons License
Trackback 0 : Comment 11
http://alones.byus.net/tt/trackback/526
From. BlogIcon in jacksonville nc rental 2008/03/13 07:09Delete / ModifyReply
너는 차가운 위치를 만들었다!
From. BlogIcon adult diaper pants plastic 2008/03/13 07:58Delete / ModifyReply
많은 감사 우수한 위치! 나는 너의 웹사이트를 사랑한다!
From. BlogIcon golden shower amateur 2008/03/13 08:52Delete / ModifyReply
위치에 중대한 일은 그것을 좋아했다!
From. BlogIcon topless college girl 2008/03/14 03:47Delete / ModifyReply
이 위치는 유익한뿐 아니라 재미있는다!
From. BlogIcon fantasy girl 2008/03/14 03:48Delete / ModifyReply
많은 감사 우수한 위치! 나는 너의 웹사이트를 사랑한다!
From. BlogIcon big breast nipples small 2008/03/14 04:36Delete / ModifyReply
중대한 위치 축하!경이롭 위치!
From. BlogIcon mom poetry 2008/05/23 04:42Delete / ModifyReply
너는 위치를차가운 만들었다!
From. BlogIcon donita dunes pic 2008/05/23 05:16Delete / ModifyReply
위치에 그것을 중대한 일은 좋아했다!
From. BlogIcon rubber raft 2008/05/24 00:09Delete / ModifyReply
위치에 그것을 중대한 일은 좋아했다!
From. BlogIcon pregnant myspace layout 2008/05/24 02:02Delete / ModifyReply
너의 방문한 위치를 즐기는!
From. BlogIcon blog sexe 2008/05/24 03:25Delete / ModifyReply
걸출한 위치! 많은 감사.

굳이 사용할 필요가 없는 경우도 있고, 아예 지워버려도 될 것이다.

From: http://blog.naver.com/bgcho98?Redirect=Log&logNo=130015511702

Windows DLL 의 DLLMain 함수에 관해서 낙서장

2007/03/12 10:46

http://blog.naver.com/bgcho98/130015511702

Windows로 DLL 개발시에 사용되는

DLLMain 함수에 대해서 알아보자..


참조 : http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vccore/html/_core_initialize_non.2d.mfc_dlls.asp


역시 우리들의 친구 MSDN 에서 알아본 결과..


한글로 되어 있어서 설명할 필요가 있나.. ㅎㅎ


오 link 옵션에 /ENTRY 옵션을 주고 DLLMain 함수 이름을 변경할 수 있다고 한다.


근데 이 페이지는 내가 원하는게 아닌듯


어쨋든 영어 사이트로 다시 찾아보니


참조 : http://msdn2.microsoft.com/en-us/library/ms682583.aspx


여기에 내가 원하는 결과가 있다.


DLL이 로드될때나 언로드 될때 불려진다고 하며



BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,
  DWORD fdwReason,
  LPVOID lpvReserved
);


중요한건 fdwReason으로 각각 올 수 있는 값을 보면


* DLL_PROCESS_ATTACH : 프로세스 시작의 결과로 현재 프로세스의 가상 주소안으로 로드되었을 경우 ( 묵시적 연결 ) 나 LoadLibrary가 호출 되었을 경우 이 값이 넘어온다.

* DLL_THREAD_ATTACH : 현재 프로세스가 새로운 쓰레드를 생성할 때 attached된 모든 DLL의 DLLMain 을 호출하게 된다.

* DLL_THREAD_DETACH : 쓰레드가 죽을 때 ATTACH와 마찬가지로 호출된다.

* DLL_PROCESS_DETACH : 프로세스가 죽을 때나 FreeLibrary 가 호출 될 경우

크리에이티브 커먼즈 라이센스
Creative Commons License
Trackback 0 : Comment 14
http://alones.byus.net/tt/trackback/525