'VS2005'에 해당되는 글 5건

  1. 2010.04.27 "응용 프로그램 구성이 올바르지 않기 때문에..." 해결 방안
  2. 2008.10.24 에디트 플러스에서 C 컴파일, 실행 하기 4
  3. 2008.10.01 노트북의 배터리 정보를 받아오자
  4. 2008.09.22 error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR'
  5. 2008.09.08 VS2005 응용프로그램 에러.. "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다..." 3
2010. 4. 27. 13:39

"응용 프로그램 구성이 올바르지 않기 때문에..." 해결 방안



예전에 http://todayis.tistory.com/148 에 "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오." 라는 주제에 대해서 이야기 한 적이 있었다.

왠만한 경우 'vcredist_x86.exe' 파일을 설치함으로 해결 되었던 것으로 기억이 되는데.. 왠지 이번에 만든 프로그램의 경우 전혀 먹히질 않는다.. -_-;

http://kldp.org/node/95859 의 대글을 보니 이런 부분이 있다.

좀 더 정확히 얘기하면, Side-by-Side Assembly가 없어서 발생하는 문제이죠.

Visual Studio 2005부터는 공용 DLL을 System32라는 곳에 몰아서 보관하지 않고, WinSxS라는 공용 어셈블리 저장공간에 별도로 저장하게 됩니다. 이렇게 저장하는 이유는 버전 충돌을 막기 위해서이고요.

이러한 공용 어셈블리의 위치 정보는 모듈의 Menifest에 저장되어서 참조되게 됩니다.

그래서 사용하는 DLL을 단순히 복사하셔서는 안되고요. cynicjj님 말씀처럼 재배포 패키지를 이용해서 공용 DLL들을 설치하셔야 합니다. (Menifest는 Windows XP이상에서만 사용할 수 있기 때문에, Windows2000에서는 그냥 System32나 어플리케이션이 있는 폴더에 DLL들을 같이 복사해 주셔야 하고요.)

참고로 그런에 에러가 나왔을때, Dependency Walker 프로그램을 이용하면, 무슨 DLL이 없는지 쉽게 확인하실 수 있습니다.


이런 비슷한 내용을 본적이 있는데..
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

위의 사이트를 보니
실행 파일 자체와 실행 파일에서 액세스하는 DLL들에 대한 manifest 파일들을 private assembly로서 같이 배포하면, 에러를 피할 수 있다. 

라고 한다. 

위의 문제를 해결하기 위해서 "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86" 를 찾아보면 "Microsoft.VC80.CRT" 와 "Microsoft.VC80.MFC" 폴더가 존재한다.
Win32API의 경우 "Microsoft.VC80.CRT", MFC의 경우 "Microsoft.VC80.MFC" 디렉토리 내의 파일들과 함께 실행파일을 제공하면 될 듯 하다.

실행파일에 대한 manifest 파일도 필요하다고 하는데.. 그 파일 없이도 일단 실행이 되는것은 같은데..
참고로 실행파일에 대한 manifest 파일은 프로젝트 관련 디렉토리 내의 Debug 혹은 Release 디렉토리 내에 존재한다.

2008. 10. 24. 11:50

에디트 플러스에서 C 컴파일, 실행 하기


VS2005를 사용해서 윈도우즈 상에서 프로그래밍을 하고 있는데.. 솔직히 너무 무겁다. 구지 GUI를 사용하지 않는 프로그램이나 간단한 테스트 프로그램을 작성해서 테스트를 하려 해도 프로젝트를 생성해야하고.. 이런 저런.. -_-;
그래서 보다 가벼운 에디터를 사용해서 사용할 수 있는 방법을 알아보았더니 에디트 플러스와 같은 에디터에 C 컴파일러를 연동해서 프로그래밍을 할 수 있는 방법이 있어서 사용을 해보려 한다.

먼저 에디트 플러스에서 C 언어를 컴파일 하기 위해서는 우선 컴파일러가 준비되 있어야 한다. 개인적으로 VS2005를 사용하기 때문에 MS에서 제공하는 컴파일러를 사용할 것이다.

에디트 플러스를 실행하고, 도구(T) - 기본 설정(T)를 선택한다.
그리고 기본 설정 창의 왼쪽의 항목(C)란에서 도구-사용자도구를 선택한다. 그리고 오른쪽 그룹과 도구 항목에서 추가(D)>> - 프로그램(P)를 선택한다.
메뉴의 도구 - 기본 설정 클릭, 기본 설정 항목의 사용자도구 선택, 그룹과 도구항목의 추가 - 프로그램

추가 버튼을 클릭한 후 메뉴제목, 명령, 인수, 디렉토리 항목을 각각 채워 넣는다.
본인의 경우 메뉴제목'C compiler'로 했다.
명령은 우측의 ...버튼을 클릭하면 파일을 선택하는 창이 뜨는데 다음의 경로(C:\Program Files\Microsoft Visual Studio 8\VC\bin)로 가서 'cl.exe'를 선택한다.
인수는 우측의 화살표 버튼을 클릭해 파일이름을 선택한다.
디렉토리도 마찬가지로 우측의 화살표 버튼을 클릭해 파일디렉토리를 선택한다.

이것으로 에디트플러스에서 C언어를 컴파일 할 수 있는 환경은 완성 된 것이다.

추가로 생성한 바이너리 파일을 실행할 수 있는 환경을 만들것이다.

컴파일 환경을 만든 것과 동일하게 그룹과 도구 항목의 추가 - 프로그램 을 선택한다.
메뉴제목에 대충 실행할 이름을 넣는다. 본인의 경우 'Run'이라고 입력하였다.
명령$(FileNameNoExt)라고 직접 입력을 한다.
인수는 공란으로 비워둔다.
디렉토리는 오른쪽의 버튼을 클릭하여 파일디렉토리를 선택한다.

이것으로 에디트 플러스에서의 C 언어 컴파일과 실행을 위한 준비는 모두 끝이 났다.
Ctrl+1을 누르면 컴파일이 될 것이고, Ctrl+2를 누르면 해당 명령이 실행될 것이다.

마지막으로 환경변수(시스템 변수)를 세팅해 주어야 한다.

'내컴퓨터-속성-고급-환경변수-시스템 변수-Path' 를 더블클릭하면, 시스템 변수 편집 창이 뜰것이다. 변수값의 마지막에 ';'를 넣은 후 'C:\Program Files\Microsoft Visual Studio 8\VC\bin;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE'를 추가로 입력하고 확인버튼을 클릭한다.

시스템 변수의 새로만들기 버튼을 클릭한 후 아래와 같이 값을 넣고 확인 버튼을 클릭한다.
변수 이름 : INCLUDE
변수 값    : C:\Program Files\Microsoft Visual Studio 8\VC\include

또 다시 시스템 변수의 새로만들기 버튼을 클릭한 후 아래와 같이 값을 넣고 확인 버튼을 클릭한다.
변수 이름 : LIB
변수 값    : C:\Program Files\Microsoft Visual Studio 8\VC\lib

이제 모든 세팅이 완료 되었다. 에디트 플러스를 재실행 한 후 간단한 테스트 프로그램을 작성해 테스트를 해보자
Ctrl+1을 눌러 컴파일을 한 모습

Ctrl+2를 눌러 프로그램을 실행한 모습니다.

2008. 10. 1. 12:03

노트북의 배터리 정보를 받아오자


10월의 첫날부터... 이런 상투적인 업무 포스트밖에 올릴 것이 없다는게 참 슬프긴 하지만.. 그리도.. 머.. -_-;;

노트북의 배터리의 정보를 받아오는 부분에 대해서 뭔가를 하고 있다. 배터리의 용량, Voltage, 상태... 뭐 그밖의 등등..  검색을 하던중.. 좋은 정보를 얻어 포스팅 한다.
MSDN에서 검색을 했는데 'Enumerating Battery Devices'라고 꽤 쓸만한 예제 소스가 있었다.
여기(http://msdn.microsoft.com/en-us/library/bb204769(VS.85).aspx )를 클릭하면 정보를 얻을 수 있다.

이녀석을 바로 적용하면 동작하지는 않고 몇가지 수정을 해주어야 한다.
VS2005환경에서 Win32 API를 이용하여 테스트 프로그램을 작성하였다.

일단 필요한 헤더 파일('BatClass.h', 'Setupapi.h')을 적당한 위치에 넣어(#include)준다.
BatClass.h는 배터리에 관련된 것들을 정의해 놓은 헤더파일이고, Setupapi.h는 'SetupDiGetClassDevs', 'SetupDiEnumDeviceInterfaces', .. 등과 같은 함수들을 정의해 놓은 헤더파일이다.

헤더파일을 추가하고 컴파일을 하게 되면 에러가 뜰것이다. 안뜰지도 모르지만.. 본인의 경우에는 에러가 있었다.
HDEVINFO hdev = SetupDiGetClassDevs(&GUID_DEVCLASS_BATTERY, 0, 0, DIGCF_PRESENT |                                                                DIGCF_DEVICEINTERFACE);
위의 위치에서 'GUID_DEVCLASS_BATTERY' 라는 녀석이 정의되지 않아 찾을 수 없다고...

BatClass.h라는 파일을 찾아서 열어본다.
이런 저런 코드들이 보일텐데.. GUID_DEVCLASS_BATTERY를 검색해보면 없을 거이다. GUID_DEVCLASS_BATTERY를 추가시켜주어야 한다.
코드를 대충 보면 비슷한 녀석들이 모여있는 곳이 있다. 그곳에 다음을 넣어준다.
...
DEFINE_GUID( GUID_DEVCLASS_BATTERY,
                      0x72631E54, 0x78A4, 0x11D0, 0xBC, 0xF7, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A);
...

구글에서 검색하다 찾았는데.. 위의 문장이 정의된 GUID_DEVCLASS_BATTERY 의 값인듯 하다.

이렇게 수정을 하고 컴파일을 다시 하면, 정상적으로 빌드가 될 것이고, 추가로 필요한 배터리의 정보는 소스의 내용을 수정해서 얻을 수 있을 것이다.

소스는 분석을 해봐야 더 정확한 것을 알 수 있을 듯한데.. 배터리 뿐만 아니라 여러 디바이스 드라이버의 정보를얻을 때에도 유용하게 쓰이는 듯 보인다.



2008. 9. 22. 10:34

error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR'


VS2005를 사용하면서 'error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR''라는 에러 메시지를 종종 보게 된다.

CreateFile()라는 함수를 사용할 때 첫번째 인자의 형식이 잘못된듯한데.. 지금 사용하고 있는 CreateFile()라는 녀석을 보면 CreateFile("aaa.txt",GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)로 문자열을 처리하는 부분이다.
"aaa.txt"라는 문자열을 사용하고 있었는데.. 이를 TEXT("aaa.txt")라든지 L"aaa.txt"로 바꾸어주면 에러가 발생하지 않는다.

하지만.. 다른 문제가 발생해 버렸다. 메지시 박스로 테스트 문자열을 출력하는데 다음과 같이 문자열이 깨져나오는 현상이 발생을 한 것이다.

이 부분을 해결하기 위해서는 문자 집합(Character Set)의 설정을 바꾸어 주어야 하는 모양이다.
VS2005의 메뉴에서 Project->Properties...(Alt+F7)을 선택하여 해당 프로젝트의 프로퍼티 창을 연다. 왼쪽의 항목을 보여주는 창에서 Configuration Properties의 General에서 Character Set 항목을 살펴본다. 기본적으로 VS2005에서는 Character Set이 'Use Unicode Character Set'으로 되어 있는 듯 하다. 이녀석의 세팅을 'Use Multi-Byte Character Set'으로 수정을 한다.

다시 컴파일을 한 뒤 실행을 시키면 원하는 결과를 얻을 수 있을 것이다.

한결 보기 좋아졌다... 아니 많이 보기 좋아졌네..

간단한 것인데.. 툴에 대해 모르는 것이 너무 많아 고생을 많이 하는 부분중에 하나인 듯 하다.

2008. 9. 8. 13:55

VS2005 응용프로그램 에러.. "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다..."



프로그램을 짜다보면 희안한 그리고 황당한 일을 많이 겪는다.

'VS2005' 에서 간단한 테스트 프로그램을 작성하고 동작을 잘하는 것을 확인하고나서 다른 PC로 실행파일을 옮겨 실행을 시키니 다음과 같은 에러 메시지가 뜬다.
응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오.
사용자 삽입 이미지

같은 프로그램을 동일한 OS가 설치된 다른 기계에서 실행이 되지 않는 이런.. XX같은 일이... -_-;;
해결방안을 찾기 위해 구글이며 네이버며.. 여기 저기 뒤진 결과 일단은 해결을 했다.

가장 간단한 방법은 'vcredist_x86.exe'를 에러가 발생하는 PC에 설치를 해주면 된다.
VS2005가 설치된 PC에서 "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86"폴더를 확인하자.
vcredist_x86.exe 라는 파일을 발견할 수 있을 것이다. 이 녀석을 테스트 하려 하는 PC에 설치를 한 뒤 에러가 발생했던 테스트 프로그램을 실행시켜 보면 정상적으로 동작하는 것을 확인 할 수 있다.
혹시... visual studio가 설치 되지 않아 파일을 찾을 수 없는 사람이라면... 아래 파일을 받아서 사용하면 된다.

다른 방법으로는 mfc80.dll, msvcr80.dll 등을 실행파일과 같은 폴더에 복사한 뒤 프로그램을 실행하면 된다고들 하는데.. 본인의 경우에서는 그렇지 않았다. 대신 위에서 설명한 vcredist_x86.exe 를 설치한 뒤에 정상적으로 동작을 하였다.

이런 현상이 발생하는 이유는 다음과 같다.
Windows XP에서는 DLL Hell(새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로 오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우가 있다.)을 빠져나가려고 Side-by-Side Assembly라는 개념을 만들었다.
이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.

SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.

이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.

문제 해결에 대한 페이지
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
http://www.codeproject.com/cpp/vcredists_x86.asp
http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8


- 홍가일보 블로그에서 살짝 가져옴... ^^;

아.. 그런데.. 이런 응용프로그램을 만들어 배포할 경우에는 어쩌지? -_-;;