Create TOC

2008년 9월 20일

Win32/프로세스 실행 방법에 따른 argument 해석

프로세스 실행 방법에 따라서 argument 해석이 어떻게 달라지는지 간단한 테스트를 수행했다.

테스트

프로세스를 실행시킬 수 있는 API중 ShellExecuteEx()와 CreateProcess() 에 대해서 테스트를 수행한다. 실행시 인자는 "12345"를 사용한다.

ShellExecuteEx

입력

인자
SHELLEXECUTEINFO::lpFileC:\Test\MyTest.exe
SHELLEXECUTEINFO::lpParameters12345

결과

argument를 얻는 방법결과
CWinApp::m_lpCmdLine12345
GetCommandLineW()"C:\Test\MyTest.exe" 12345
argc2
argv[0]C:\Test\MyTest.exe
argv[1]12345

CreateProcess 1

입력

lpApplicationNameNULL
lpCommandLine"C:\Test\MyTest.exe" 12345

결과

argument를 얻는 방법결과
CWinApp::m_lpCmdLine12345
GetCommandLineW()"C:\Test\MyTest.exe" 12345
argc2
argv[0]C:\Test\MyTest.exe
argv[1]12345

CreateProcess 2

입력

lpApplicationNameC:\Test\MyTest.exe
lpCommandLine"C:\Test\MyTest.exe" 12345

결과

argument를 얻는 방법결과
CWinApp::m_lpCmdLine12345
GetCommandLineW()"C:\Test\MyTest.exe" 12345
argc2
argv[0]C:\Test\MyTest.exe
argv[1]12345

CrateProcess 3

입력

lpApplicationNameC:\Test\MyTest.exe
lpCommandLine12345

결과

argument를 얻는 방법결과
CWinApp::m_lpCmdLine
GetCommandLineW()12345
argc1
argv[0]12345

결론

  1. 프로세스를 실행할때는 가급적 ShellExecuteEx() API를 사용한다.
  2. CreateProcess() API를 사용할 때는 lpCommandLine 인자에 전체 명령행을 완성해서 전달한다.

error LNK2005

MFC 와 runtime library의 링크 순서가 잘못될 경우 아래와 같은 메시지를 볼 수 있습니다.

mfc42u.lib(dllmodul.obj):error LNK2005: _DllMain@12 already defined in MSVCRT. lib(dllmain.obj)

해결책은 아래와 같습니다. (VC6 기준)

  1. Project 메뉴에서 Settings를 누릅니다.
  2. Project Settings 대화 상자의 Settings For 에서 링크 오류가 발생하는 프로젝트 구성을 선택합니다.
  3. Link 탭의 Category 콤보 상자에서 Input을 선택합니다.
  4. Ignore libraries 상자에 msvcrt.lib 를 삽입합니다.
  5. Object/library modules 상자에 라이브러리 mfcs42u.lib msvcrt.lib 를 삽입합니다.

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

2008년 9월 15일

Debian/VirtualBox 설치하기

이 문서는 Debian 에 VirtualBox를 설치하는 방법을 설명한다.

Package 설치

apt-get 등을 사용해서 아래 package를 설치한다.

$ sudo apt-get install virtualbox-ose virtualbox-ose-guest-utils virtualbox-ose-modules-2.6-686

모듈 설정

/etc/modules에 vboxdrv를 추가한다.

$ sudo cat vboxdrv >> /etc/modules

사용자 설정

VirtualBox 를 사용할 사용자를 아래 명령을 이용해서 vboxusers 그룹에 추가해준다.

$ sudo addgroup 사용자id vboxusers

공유 설정

host - VirtualBox 간의 공유 설정은 아래와 같이 하면 된다.

  1. VirtualBox의 설정 - 공유 폴더 에서 머신 폴더 설정. 여기에선 이름을 xxx 라고 한다.
  2. VirtualBox의 OS가 window라면 net use x: \\vboxsvr\xxx, linux라면 mount -t vboxsf xxx /mnt/원하는이름

심리스 모드 사용

VirtualBox의 심리스 기능을 사용하면 아래 화면처럼 윈도우 바탕화면을 보지 않고 원하는 프로그램만 host의 프로그램처럼 실행시킬 수 있다. 아래 화면은 Debian에서 VirtualBox의 심리스 모드를 이용해서 Internet Explorer 를 실행한 화면이다.

심리스 모드는 host키기본 값은 오른쪽 control + L을 누르면 된다.

한/영 전환키 사용

한/영 전환키를 SCIM같은 입력기에 설정해서 사용할 경우 VirtualBox에서는 한/영 전환키를 사용할 수 없다. 이때는 아래와 같은 script를 작성해서 사용하면 된다.

#!/bin/sh
GTK_IM_MODULE=none
QT_IM_MODULE=none
XMODIFIERS=none
VBoxManage startvm <vm 이름>

vm 이름VBoxManage list vms 명령을 사용해서 확인할 수 있다.

2008년 9월 12일

Debian/KVM+QEMU를 이용한 가상 머신 구성하기

이 문서는 Debian 에서 KVMQEMU 를 사용해 가상 머신을 만드는 것을 설명한다.

준비

패키지 설치

sudo apt-get install kvm qemu

모듈 설정

부팅할 때 필요한 모듈이 올라오도록 아래와 같이 설정한다.

cat kvm-intel >> /etc/modules

사용자 설정

가상 머신을 실행할 수 있도록 권한을 설정한다.

sudo adduser <id> kvm

설치

설치는 모듈 시작과 재 로그인을 수동으로 해주거나 재 부팅 후 시작한다.

disk image 만들기

2GB 짜리 이미지를 생성한다(용량은 필요한 만큼 지정하면 된다).

qemu-img create winxp.img -f qcow 2G

OS 설치

처음 아래 명령으로 qemu를 시작한다.

SDL_VIDEO_X11_DGAMOUSE=0 qemu -no-acpi -m 512 -cdrom cdimg.iso -hda winxp.img -boot d

설치 화면이 뜨면 qemu를 종료한다. 이 작업을 하지 않고 바로 kvm을 실행하면 아래와 같은 오류 메시지를 만나게 된다.

qemu: could not open disk image winxp.img

다시 kvm을 사용해서 OS 설치를 시작한다.

SDL_VIDEO_X11_DGAMOUSE=0 kvm -no-acpi -m 512 -localtime -cdrom cdimg.iso -hda ~/qemu/winxp.img -boot d

이때 -no-acpi 옵션을 주지 않으면 매우 느리게 동작한다.

실행

설치한 가상 머신을 실행해본다.

SDL_VIDEO_X11_DGAMOUSE=0 kvm -no-acpi -m 512 -localtime -net nic -net user -hda ~/qemu/winxp.img -boot c

실행화면은 아래와 같다.