C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[139] Vista 호환 프로그램 만들기 실패작 암울 - 조언 부탁드립니다.
박영목 [gsbsoft] 17821 읽음    2007-08-29 16:12
Devpia에 질문을 했습니다. 오늘 2개 정도 답변이 왔고... 저 대로 관찰하면서 했는데...
다른 의견 있으면 조언 부탁드립니다.... Vista...  피곤해....

박영목 (gsbsoft)  - Vista 호환 프로그램 만들기  실패작 암울... 조언 부탁드립니다.

이 글을 올리는 것이 약간 쪽팔린다는 느낌... 그래도 나름대로 고민이 되었어... 욕하지 마시고 가르쳐 주세요... 프로그램을 하나 만들어 배포를 했습니다. ㅋㅋㅋ 늘 단일 사용자만 만들었으므로 Vista를 별로 생각지도 않고... ㅋㅋㅋ

그러다 배포 후 문제점들이 있더군요....  워낙 Test를 하지 않고 했기 때문에...  물론 프로그램은 잘 돌아갑니다. ㅋㅋㅋ 쓸데 없는 트래픽과 남의 하드와 REG를 더럽힌다는 외에는 ...   흐흐헉...

REG는 LOCAL_MACHINE보다  CURRENT_USER, Program Files보다  사용자\사용자이름\폴더 를 사용한다(비스타에서 권장) 그래서 여기에 맞추어 할려고 노력함.... 아무 생각없이..

파일은 실행프로그램만 Program Files에 넣는다.

그 외에 프로그램에서 생겨나거나 하는 것들은   사용자\사용자이름\폴더 를  하나 만들어 그곳에 보관한다. Update 파일도 이곳에 보관했다.  Test할 때도 단일 사용자 행태로 했다. 잘 된다. 그냥 배포....

그러다 뒤에 보니 다른 사용자 계정을 만들어서 사용해 보니 실행도 다 잘 된다.

문제는  Update.exe나 Update할 실행파일 등도 버전이 바뀌어 Update할 때 다른 사용자 계정에 들어갈 때마다(버전 정보를 CUREENT_USER에 두었기 때문에) Update를 한다는 것입니다. 그러니 Update를 한번 시키면 사용자 계정이 3개 있으면 3번 똑같은 일을 합니다(버전업이 이미 되었음에도).  아무 생각없이 프로그램 했음.... ㅎㅎㅎ

그리고 Unistall할 때 하나의 계정해서 UnInstall 하게 됩니다.  그러면 그 계정의 것은 다 잘 삭제됩니다. 완벽히 됩니다.

그런데 다른 계정들은  시작프로그램(CURRENT_USER에 등록), 사용자\폴더(Main프로그램이 생성한 환경이나 DATA 등) 지워 지지 않습니다. ㅋㅋㅋ

그래서 수정해야 겠다고 마음을 먹고 공통되는 것들을 어디로 할까?  REG와 FILE, 왠만하면 manifast도 없이 동작할 정도의 권한으로 동작되게....

Update.exe는  관리자 관한으로 실행되게 해야겠다.
그래서 Main 프로그램 버전 Update의 버전 Update의 어떤 귀중한 정보는 LOCAL_MACHINE에 기록한다.

그리고 Update.exe파일, Update할 실행파일 등 공통으로 사용되는 것은 사용자\Public\폴더 를 만들어 저장한다. 메모장으로 해보니 다 접근이 되는 것으로 보입니다.

그리고 개개인의 사용자가 프로그램에서 생성된 DATA들은 사용자\사용자이름\폴더 에 보관한다.

이렇게 하면 그런대로 VISTA에 맞게 돌아갈 것 같은데.....  혼자 고민하니... 그래서 이렇게 공개적 질문을 올립니다.   문서를 찾아는 것도 잘 찾아지지 않고...귀차니즘...

문제점들은

1. 사용자\Public 폴더 아래 특정 폴더 생성하고 그곳에 내 프로그램이 사용하는 공통된 것을 두는 것이 정상적인 것인지????  궁금 Vista에서 추천하지 않는 것은 아닌지...... 혹 후일 막아 버리면 Update 자체가 안되어 막대한 손실이 발생하겠지요

2. unistall 할 때 그래도 사용자\사용자이름\ 폴더 아래 특정폴더를 모든 계정에 있는 것을 다 삭제 하지 못하겠다는 것,...  NSIS를 사용하고 있는데( HM NSI 2.0.3 버전)   아직 잘 사용한다고 볼 수 없음.. 그냥 따라고 하고 베끼고...   모든 사용자에 있는 특정 폴더를 한번에 지우는 것과 모든 사용자의 CURRENT_USER에 있는 특정 Key를 지우는 방법을 모르겠다는 사실입니다.???


이 2개만 명확해도 불안은 없을 것 같습니다.  별것 아닌 것 같은데... 저에게는 중요함...


아시는 분 명확한 조언 기다려 봅니다...            부산에서....

================================================

유재권 (tiyal)  - [답변]명확하지 않은 답변입니다.   

1. 사용자\Public 폴더 아래 특정 폴더 생성하고 그곳에 내 프로그램이 사용하는 공통된 것을 두는 것이 정상적인 것인지????  궁금 Vista에서 추천하지 않는 것은 아닌지...... 혹 후일 막아 버리면 Update 자체가 안되어 막대한 손실이 발생하겠지요


- 이건 비스타를 안써서 모르겠습니다.
하지만 권장사항은 어디까지나 권장 사항일 뿐입니다. 저라면 그냥 PROGRAM FILES에 설치 하겠습니다.
PROGRAM FILES 은 WINDOWS에서 사용하는 필수 파일들도 있기 때문에 잘못 지우거나 덥어쓰거나 할 경우와 보안상에 사용권한 때문에 사용자 폴더에 설치는 권장하는것으로 보입니다. 하지만 이 권장사항이 프로그래머에게 하는 권장 사항인지는 의문입니다. 제가 볼때는 컴퓨터를 쓸줄만 아는 사람을 위한 권장 사항으로 보입니다.

2. unistall 할 때 그래도 사용자\사용자이름\ 폴더 아래 특정폴더를 모든 계정에 있는 것을 다 삭제 하지 못하겠다는 것,...  NSIS를 사용하고 있는데( HM NSI 2.0.3 버전)   아직 잘 사용한다고 볼 수 없음.. 그냥 따라고 하고 베끼고...   모든 사용자에 있는 특정 폴더를 한번에 지우는 것과 모든 사용자의 CURRENT_USER에 있는 특정 Key를 지우는 방법을 모르겠다는 사실입니다.???

저역시 NSIS에 대해 세세히 알지는 못합니다만 그나마 알고 있는 바로는 NSIS에서 사용가능한 레지스트리의 ROOT 키는 HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_USERS, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA, HKEY_PERFORMANCE_DATA 인것으로 알고 있습니다. 아마도 모든 사용자의 특정폴더를 한번에 지우는 기능은 없을 것 같습니다. 이 역시 저라면 그냥 HKLM을 사용하겠습니다.

================================================

박영목 (gsbsoft)  - 이제 한 분이 답을 주셨네요.... 감사합니다.... 

================================================

김선영 (ksyhwn) - [답변]흠...

1. 사용자\Public 폴더 아래 특정 폴더 생성하고 그곳에 내 프로그램이 사용하는 공통된 것을 두는 것이 정상적인 것인지????  궁금 Vista에서 추천하지 않는 것은 아닌지...... 혹 후일 막아 버리면 Update 자체가 안되어 막대한 손실이 발생하겠지요

-- 이렇게하라는건 권한때문에 일반 프로그램이 program files에 잇는 파일을 삭제하거나 수정할 수 없기 때문에 그럴겁니다. 권장이죠.. HKLM 레지스트리 쪽에서 쓰지도 지우지도 못합니다.

반드시 삭제도 되고 수정도 되야되는데 파일이 program files 안에 있으면
그럼 프로그램에 manifest에  level="requireAdministrator" 를 줘서 관리자 권한으로 권한 상승을 할 수 있도록해야되요. 아니면 프로그램 자체를 서비스가 띄우던지 하던가...

2 번은 글쎄요. uninstall 이야 권한은 상승됐을테고 찾아서 지워야하나... 그건잘.. 밥먹을 시간이라..;;

================================================

박영목 (gsbsoft) - [답변]대답에 대해 아직도 허기를 느낌니다. 꿀꺽~

이제 두 분이 답을 주셨네요.... 감사합니다.... 

사용자\사용자이름\생성한폴더    하라는 것은 보았는데...
사용자\Public\생성한폴더   에  하는 것이 옳은 것인지를 모르겠습니다.  분명히 프로그래머 입장에서 여기데 긴가 아니가?

제가 보았을 때는 이것에 폴더를 만들어 사용하면 다른 계정에서도 공통으로 사용해서 좋을 것 같고  uninstall 할 때도 좋은 것 같은데..
여기에 대한 언급을 보지 못해서... 혹 보신 분이나... 아시는 분   답변 부탁드립니다.....

배고파....~~~   식사 마-ㅅ 있게  하십시오  ^^

================================================

박영목 (gsbsoft) - [답변]실험을 해보니 파일 저장한 Users\Public\폴더 가 좋을 것 같습니다.

Vista에서 Data를 저장하기 좋은 곳은 Users\Public에 폴더를 만들고 사용하는 것이 제일 좋아 보입니다. 실험을 해보니 권한 상승도 필요없고 다른 계정의 사람들도 마음대로 접근할 수 있고  위에서 발생한 문제에 대해 파일쪽은 해결이 된 것 같습니다.

uninstall시 REG에서 모든 사용자 계정의 특정 Key를 삭제할 수 있으면 되겠습니다.
위의 것이 확신하게 된 것은  XP에서 Vista에 User 대응하는 것이 Documents and Setting 입니다.

그 아래 보면   All Users가 있습니다. 이것이 Vista의  Public과 같은 것으로 보입니다.
물론 XP에서는 All Users 폴더 아래 Application Data라는 폴더가 있는데. 그곳에 Adobe, ESTsoft. Goole. InstallShield, Microsoft 등이 자신들의 폴더를 만들고 Data를 저장하고 있는 것이 보입니다.

그런데 Vista에서는 Application Data가 없네요.... 이것이 약간 찜찜합니다.  ㅋㅋㅋㅋ

XP를 보았을 때 저렇게도 사용했으므로 Vista에 Public  안에 자신의 폴더를 만들고 사용하는 것에 대한 부작용은 없을 것으로 보입니다. 그런데... 앞에서도 말헀지만 Application Data 폴더가 없는 것이 약간 걸림.... 

나는 이제부터 이쪽에 방을 만들려고 합니다. 사용자\사용자이름\폴더 보다 사용자\Public\폴더가 여러가지로 좋을 것 같습니다. 앞에서 문제가 되었던 것이 해결되는 방 ㅋㅋㅋㅋ....  GetEnvironmentVariable로 한번에 어떻게 찾지??? 또 알아보아야겠습니다.  

그러나 포로젝트 따라 꼭 유저가 분리되는 Data를 보관할 경우는 Users\사용자이름\폴더로 하게 될 것 같습니다,.

이때는 UNINSTALL시가 약간 문제가 있겠네요,... 응용으로 다 만들면 될 것 같지만....ㅋㅋㅋ 이렇게 해서는 안되지요...

아직도 CURRENT_USER 모든 계정에 특정 Key 삭제는 안되겠네요.... 에고


끝....  


다른 정보나 조언 부탁드립니다.    부산에서 박영목 ............

================================================


==== 추가  ====

조금 더 찾고 실험 해 보았습니다.

HomeDrive - 로그인한 계정의 정보가 들어있는 드라이브
HomePath - 로그인한 계정의 폴더
SystemDrive - 윈도우가 부팅된 드라이브
SystemRoot - 부팅된 운영체제가 들어있는 폴더
ProgramFiles - 기본 프로그램 설치 폴더
TEMP,TMP - 임시 파일이 저장되는 폴더
ComSpec - 기본 명령 프롬프트 프로그램
USERDOMAIN - 로그인한 시스템의 도메인 명
USERNAME - 로그인한 계정 이름
USERPROFILE - 로그인한 유저의 프로필이 들어있는 폴더명
ALLUSERSPROFILE - 모든 사용자 프로필이 저장된 폴더
APPDATA - 설치된 프로그램의 필요 데이터가 저장된 폴더
LOGONSERVER - 로그인한 계정이 접속한 서버명
Path - 실행 참조용 폴더 지정 목록
PathEXT - 참조용 폴더에서 검색한 파일들의 확장자 목록
WINDIR - 윈도우가 설치된 폴더

=========================================

  #define BUFSIZE  300

  LPTSTR lpszOldValue;
  char  tchBuf[BUFSIZE];
  BOOL fSuccess;
                                            //USERPROFILE, TEMP, windir, USERNAME, ALLUSERSPROFILE
  lpszOldValue = ( (GetEnvironmentVariable( "ALLUSERSPROFILE", tchBuf, BUFSIZE ) > 0 ) ? tchBuf : NULL );

====

XP의 Application Data는 Vista에서 ProgramData 폴더 입니다. 그냥 탐색기로 보면 보이지 않고 도스명령창으로 보면 보이내요

GetEnvironmentVariable( "APPDATA"... 이렇게 하니 나오내요....  여기에 보관하는 것도 좋을 것 같습니다. MS도 여기에 저장하고 있으니... 믿음이 가는 군요...  Vista 이전에 왜 이런 곳을 신경쓰지 않고 프로그램 했을까?. 알집쪽은 정석대로 하려고 하는 것 같군요... ㅋㅋㅋ  벌써 사용하고 있으니....  그런데 이곳은 계정을 만들 때 관리자로 만들어야 쓸 수가 있습니다. 표준사용자는 쓰지는 못하는군요... 물론 권한인증되면 가능하게 되네요... 이곳이 더 좋을 것 같은 예감....

+ -

관련 글 리스트
139 Vista 호환 프로그램 만들기 실패작 암울 - 조언 부탁드립니다. 박영목 17821 2007/08/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.