|
위에서 한가지 제가 잊어 먹었습니다.
컴파일러가 이런 문제를 일으키면 강제로 특정 dll의 리소스를 참조하도록 하는 함수나 방법이 있을거라는 생각은 당연한 것입니다. 여러분도 그런 추측을 할수 있지요 틀리든 말든 MSDN을 뒤져보니
MFC는 AfxSetResourceHandle인가 뭔가하는거고===>어메 모르겠다 오 나의 기억의 한계다.
API는 변수로 해결하더군요 리소스를 읽을때 특정 DLL의 핸들(리소스 DLL을 가리키는 변수)을 넘겨주는것 같더군요===>어메 미치겠다 또 기억력의 한계당
저는 API를 많이 사용하므로 주로 전역변수로 리소스 핸들 변수를 정의 해놓고는 거기에 특정 리소스DLL의 핸들을 설정해놓고 사용하는 방법을 이용합니다.====>이건 완빵입니다. 제 경험으로는 넘좋아 근대 빌더에서는 오히려 문제를 일으킬듯.....
아무튼 빌더도 방법이 있으리라 생각합니다.도움말을 찾아 보시기 바랍니다.
그럼
김상면 님이 쓰신 글 :
: 제가 보기엔 리소스 참조 에러입니다.
: 저의 짐작이므로 이점 유의 하시고요
: ===>결코 정확한 답이 아닙니다.===>엄연한 깬또 덴뿌라이... =>>>캬~~~명언이당 명언....
:
:
: 가령
: main.exe first.dll second.dll third.dll
: 이렇게 네개의 실행 모듈이 있을 경우 옛날에는 어쨌는지 모르지만 프로그램의 코드가 커지면서 각각의 실행모듈내에서도 dll처럼 코드의 분리가 일어납니다. 대충
: 실행 명령 부분 리소스 부분 스택 부분 힙부분 전역부분
: 이런씩일거라고 짐작합니다.
: 당연히 이렇게 분리 되어 있으니 얼른 짐작해도 각각의 부분들은 독자적인 세그먼트를 가질거라는건 쉽게 짐작이 갑니다. 당연히 프로그램내부에서는 우리는 모르지만 이세그먼트들이 어디에 있는지를 가르키는 포이터가 있을겁니다.
: 실행명령이 필요하면 실행명령 세그먼트를 참조하고 리소스가 필요하면 리소스세그먼트를 참조하고 힙메모리에 접근할려면 힙세그먼트를 참조하고 ............
:
: 이제 리소스이야기로 넘어갑시다.
: 아까 세그먼트를 가리키는 포인터가 있다고 했는데 이중에 리소스를 가리키는 세그먼트는 처음 프로그램이 실행되면 main.exe에 있는 리소스 세그먼트를 가르키게 될겁니다. 하지만 우리는 이사실은 모릅니다. 컴파일러가 알아서 다 처리 해주기 때문에요. 그러다가 어찌 어찌 프로그램이 잘돌아 가다가 main.exe의 리소스세그먼트가 아니라 second.dll에 있는 리소스 세그먼트를 참조해야 할경우가 생겼다고 합시다. 당연히 main.exe의 리소스 세그먼트를 가리키는 포인터는 자동으로 second.dll에 있는 세그먼트를 가르켜야하는데 컴파일러가 여기 까지는 완벽하게 처리하지 못하는것 같더군요 어떤때는 잘 실행되다가 어떤때는 공포의 푸른화면 나타나다가도하고 대화 상자를 띠웠는데 이상한 윈도우가 나타나고 그러더군요
:
: 이제 대충 짐작했으니 대책을 세워야 겠지요
: 방법이야 뭐 있습니까 컴파일러가 세그먼트 관리를 제대로 안하면 우리도 개기면 됩니다. 아예 dll하나에 세그먼트 하나 요런씩으로요. 스택 세그먼트, 힙세그먼트, 전역 세그먼트는 우리가 어케 할수 없으니(안해도 1:1대응일거라는건 님들도 짐작이 가지요) 실행명령 세그먼트와 리소스 세그먼트만 우리마음대로 주물러 버리는겁니다.
: 작성중인 dll들을 두그룹으로 나눕니다.하나는 실행명령dll그룹 하나는 리소스dll그룹 요런씩으로요
: 실행명령dll들 =>> a.dll b.dll c.dll d.dll e.dll
: 리소스 dll들 =>> 대화상자.dll 아이콘.dll 커서.dll 이미지.dll
: 이렇게 하면 당연히 실행명령dll이 몇개가 되든 실행명령 세그먼트에 모두 들어갑니다. 세그먼트 포인터 전환 작업이 아예 필요 없습니다. 컴파일러야 개기든 말든 프로그램은 잘만 돌아갑니다.
: 리소스dll도 몇개가 되든 리소스세그먼트에 다들어갑니다. 컴파일러가 혼자서 메롱 하면서 까불어도 지혼자 힘빼는겁니다. 우리는 뒤에서 '고놈참 잘논다' 엉덩이나 토닥거리면서 칭찬만 해주면 됩니다.'어따 고놈 차암 잘한다'
:
: 근대요 실행명령 dll은 잘작동하는데 리소스 dll은 그래도 문제가 생기더군요==>제가 짐작이라고 한건 바로 요건때문임
: 리소스 dll들 =>> 대화상자.dll 아이콘.dll 커서.dll 이미지.dll
: 그래서 저는 한번더 개깁니다. 개기는놈 앞에는 별수 없습니다.
: 리소스 dll들 =>> resource.dll
: 완전히 하나의 dll로 만들어 버렸습니다. 완전히 짜부라트려서 압축해버렸지요. 이제는 컴파일러가 지가 아무리 날리를 쳐도 완벽 그자체입니다. 어메 좋은거.... 미치고 환장하겠당.....
:
:
: 좋아서 미치고 환장하는거는 이것만이 아닙니다. 다국어 지원입니다.
: 처음에 프로그램을 만들때 한국어 버젼으로 만듭니다. 그러다가 장사가 잘되서 미국에도 팔일이 생기면 대체로 사람들은 미국어 버젼을 만들기위해서 전체를 다시 시작합니다. 기능은 똑같은데 미국에 판다는 이유로 ......
: 근대요 님들 가만히 생각해봐요 리소스는 resource.dll에 모두 들어 있쟎아요 나머지dll들은 실행 코드만 있지 사용자 인터페이스와는 아무런 관련이 없쟎아요==>사용자 인터페이스부분은 모두 리소스이니 당연하겠죠
: resource.dll만 다시 영어로 만들어서 컴파일하면 됩니다.
: 쪽파리한테 팔때는 resource.dll만 쪽파리 버젼으로 땟놈 한테 팔때는 resource.dll만 땟놈 버젼으로 깜디들 한테는 깜디요 resource.dll로 북쪽 누렁이 한테는 누렁이용 resource.dll로 엥글로 섹슨족한테는 그거만 바꾸면 되나???====> 모르겠당 너무어렵당 언젠가는 컴퓨터가 사회성까징 해결해주리라....그때는 ASCII가 아닌 - .ㅣ(천지인)이세글자가 표준이 되겠지요 와따매 좋은거 너무 좋당 옹해야 어절씨구 옹해야..........
:
: 그럼 즐프 하세요.
: 그럼
:
:
:
:
:
:
:
:
:
: 정보지기 님이 쓰신 글 :
: : 안녕하세요.
: :
: : 회사 프로젝트때문에 빌더 6.0을 사용하고 있는데,
: :
: : 좀 이해가 되지 않는 증상을 보여서 많은 고수분들의 묻고자 올립니다.
: :
: : 제가 하고 있는 프로젝트는 각각의 기능별로 해서 DLL로 구분을 해서 개발을 하고 있습니다.
: :
: : 필요로 하다면 DLL안에 다가 폼을 추가해서 내부적으로 사용하도록 하고 있씁니다. 또한,
: :
: : 어떤 것들은 이런 폼없이 사용하는 DLL도 있고요.
: :
: : 실제 만들어서 사용하고 있는 DLL 개수는 9개 입니다.
: :
: : 이렇게 DLL로 구분을 해서 각 기능을 개발하였고, 이 DLL들을 실행 파일에서 사용하고 있는데,
: :
: : 어떤 기능을 이용하면 "Class .... not found"라고 하면서 동작을 하지 않는 것입니다.
: :
: : 물론 필요로 하는 해당 클래스는 package 형태로 이미 등록이 되어 있고, 정상적으로 사용하던 것입니다.
: :
: : 그래서, 문제가 뭔가 하고 원인을 찾아보니, 다른 DLL 중에 폼을 포함하고 있는 DLL이 있는데,
: :
: : 이 DLL에서 폼을 제거하면 정상 동작하고, 폼이 추가가 되면 위와 같은 메시지가 나오면서
: :
: : 동작을 하지 않습니다.
: :
: : 대체 이유가 뭔지 모르겠습니다. 이유와 해결 방법을 아시면 알려주세요.
: :
: : 고맙습니다. 수고하세요.
|