관리 메뉴

드럼치는 프로그래머

[API/MFC] DLL이 DLL을 참조할때 LoadLibrary()의 고찰 본문

★─Programing/☆─API | MFC

[API/MFC] DLL이 DLL을 참조할때 LoadLibrary()의 고찰

드럼치는한동이 2013. 6. 14. 08:58

질문&답변
 loadlibrary에서 궁금함...  | ActiveX/COM 2003-12-01 오후 2:10:17
차재범 (i4uman)  차재범님께 메시지 보내기차재범님을 내 주소록에 추가합니다.차재범님의 개인게시판 가기 번호: 400560  / 읽음:662

 제가 만들고자 하는것은 말 그대로 dll을 동적으로 사용할수 있는 프로그램을 만들고자 합니다.

 

장비 컨트롤을하는 프로그램인데요..A 회사 B회사 C회사 각각의 장비마다..sdk를 dll로 제공되어집니다.

이 세 회사중에서 사용자가 선택한 한 회사의 dll만 사용하려고 하는데요..그렇게 하려면 loadlibrary처럼 실행시에

dll을 연결하는 프로그램을 만들었는데 애석하게도 loadlibrary가 안먹히는 dll이 있습니다.

( 원인이 뭔가요?? win32 dll로 만든게 아니라서 그런가요?? 아니면 자기 등록 기능이 없는 dll이라서 그런가요?? )

 

atl/com 으로 wrapper dll로 만들어서 감쌀려고 합니다. 물론 실행시에 이놈을 loadlibrary()해서 쓸려고 하는데..

 

근데 어이쿠 이런..ㅡㅡ;; atl은 com의 interface pointer를 얻어서 컴객체를 사용하고 있는걸 깜박햇습니다.

 

이럴 경우 loadlibrary()가 가능한가요?

 

아니면 atl은 다른 방법으로 실행도중에 loading이 가능한가요??

 

이상 초보자였습니다.

이 글에 답변 등록하기
 [답변]다른 건 모르겠지만.. 2003-12-01 오후 3:05:47
장혜희 (pixyhh)  장혜희님께 메시지 보내기장혜희님을 내 주소록에 추가합니다.장혜희님의 개인게시판 가기 번호: 400580  

저라면 그냥 loadlibrary가 먹지 않는 dll파일을 감싸기 위해 표준 dll을 짜겠습니다. 그럼 이녀석도 loadlibrary가 문제없이 가능하겠지요.

이 글에 답변 등록하기
 [답변][지니] ^^ 2003-12-01 오후 3:35:15
신영진 번호: 400598  
loadlibrary가 실패하는 dll이란것이 잘 이해가 되지 않는군요...
loadlibrary가 실패한다면 당연히 정적 연결도 안되는 것이 일반적입니다.

loadlibrary가 실패하셨을때... GetLastError로 에러코드를 출력해서 원인이 무엇인지
판단하시는 것이 좋을 것 같습니다.

그럼^^
이 글에 답변 등록하기
         [답변]예 물론 확인했습죠.. 2003-12-01 오후 5:08:38
차재범 (i4uman)  차재범님께 메시지 보내기차재범님을 내 주소록에 추가합니다.차재범님의 개인게시판 가기 번호: 400649  

 126 번인가..잘 기억은 안나는데..

분명히...해당 dll을 찾을수 없다고 나오네요..ㅡㅡ;;

제가...엄청난 착각을 하지 않는 이상.. ( 왜냐하면...가능한 모든 경로에..다 확인했습니다.)

경로는 분명히 맞습니다. 저도..황당합니다..ㅡㅜ;;

 

참고로 이상해서  regsvr32를 먹이니까..지정된 모듈을 찾을수 없다는 말만 나오네요..같은 맥락인것 같습니다.

 

제가 굳이 atl로 할려고 하는 이유는..event 때문입니다.

저 혹시...일반 mfc dll에서도 event와 비슷하게 먹히게 하는게 있나요?

 

mfc 초자가....

이 글에 답변 등록하기
                 [답변]126번 error라... ^^; 2003-12-09 오전 12:50:07
신봉균 (sbkyun)  신봉균님께 메시지 보내기신봉균님을 내 주소록에 추가합니다.신봉균님의 개인게시판 가기 번호: 402731  

126번 error가 나는 가장 큰 이유는...

 

우리가 바보가 아닌이상 해당 DLL의 path를 잘못 지정했을리는 없죠...

 

문제는 사용하려고 하는 DLL이 다른 DLL을 참조하고 있습니다.

그런데 해당 DLL만을 link 하려고 하니 그 DLL이 참조하는 DLL을 찾을 수가 없어서 error가 나는 겁니다.

 

예를 들어 사용하려고 하는 DLL은 A.DLL 입니다.

A.DLL은 B.DLL을 참조합니다.

 

A.DLL과 B.DLL은 C:\DLL\ 밑에 있습니다.

개발하는 위치는 C:\test\ 밑에 있습니다.

test.exe가 LoadLibrary("C:\DLL\A.DLL"); 이렇게 호출을 합니다.

 

그런데 문제는 test.exe가 A.DLL은 강제로 full path를 넣어서 찾았지만

A.DLL이 참조하는 B.DLL은 system의 경로에 지정되어있지 않은 곳에 위치해 있습니다.

system의 경로라 하면 win\ system32\ 뭐 이런걸 이야기 합니다.

 

따라서 해결 방법은 B.DLL을 환경설정에서 path로 지정해 줘야 합니다.

뭐 다른 방법으로라도 path가 지정이 되면 되겠죠...

 

쉽게 테스트 할 수 있는 방법은 test.exe를 c:\DLL\ 밑에 copy를 해 놓고 실행해 보십시오.

잘 로드 될겁니다.

 

A.DLL이 참조하고 있는 DLL이 뭔가를 알고 싶다면

 

Dependency Walker 로 찾아보세요.

 

왼쪽 Tree 창에 쭉 나옵니다.

 

그럼 즐프하세요... ^^

이 글에 답변 등록하기
                         [답변]감사합니다 이문제로 골치아팠거든요 2004-08-06 오전 10:07:54
류지숙 (jsyoo772)  류지숙님께 메시지 보내기류지숙님을 내 주소록에 추가합니다.류지숙님의 개인게시판 가기 번호: 458489  

감사합니다. 하루동안 이것때문에 머리아팠는데... 해결되었습니다.

말씀하신데로 b.dll을 system32에 넣으니 되네요~

다시한번 감사합니다.

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  

 

[출처] http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=402731&ref=400560

Comments