아래 뜨는 Download 나 PC App Store는 모두의 프린터와 상관없는 광고입니다!!
특히 PC App Store는 악성 소프트웨어이니 절대 클릭하지 마세요!!
모두의 프린터는 어떠한 경우에도 본인인증, 회원가입, 카드결제를 요구하지 않습니다.
다운로드를 유도하는 애드센스 광고를 피로곰이 배포하는 프로그램들의 다운로드 링크로 착각하지 않도록 주의하시기 바랍니다. 피로곰이 배포하는 모든 프로그램은 본인인증, 회원가입, 이용료 결제 없이 무료로 사용가능합니다.
많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

Go로 MS 윈도 네이티브 GUI 프로그램 만들기 #1

앞서 크롤러 관련된 강좌를 하다 만게 있는데요.. 요청이 가장 많았어서 시작을 하긴 했는데 아무래도 크롤러가 개발자 입장으론 윤리문제가 좀 있는 영역이고 법적으로도 문제 소지가 발생할 가능성이 매우 큰 영역이라 그걸 대놓고 강좌랍시고 하는 건 좀 ;; 아닌 것 같다는 피드백도 꽤 됐던 지라.. 크롤러 관련된 강좌는 하지 않겠습니다.

저는 Go개발에 MS의 Visual Studio Code를 사용합니다. 관련 사항은 이전 111GO 글을 참고바랍니다.

이번엔 Go언어로 마이크로소프트 윈도에서 동작하는 네이티브 GUI 프로그램을 만드는 법을 다뤄보려 합니다. 강좌라느니 그런 거창 한 건 아니고요. 그냥 피로곰이란 놈은 이런식으로 쓰고 있구나? 그정도.. 그리 잘 짜여진 코드도 아니고 배울만한 뭐 그런.. 그런거 아닙니다 ㅋㅋ 그냥 저도 모두의 프린터, 모두의 PDF만들면서 대충 막 짠 코드를 기반으로 설명만 하고 말 것이라..

그럼 네이티브(Native) GUI(Graphic User Interface)가 뭐냐?

최근에는 웹서비스 관련 개발자들의 비중도 굉장히 높아지면서 일렉트론이나 기타 여러 방법으로 웹 프론트엔드 개발기술을 가지고 일반 어플리케이션 스러운 무언가를 개발할 수 있는 방법이 여럿 존재하는데요.. 멀티플렛폼 인데다 웹브라우저를 기반으로 하기 때문에 기존에 가지고 있던 개발지식만 가지고 개발이 가능하단 장점이 있어서 네이티브 개발과 경계가 점점 옅어지는 것은 사실입니다.

이러한 웹기반 프레임워크들은 HTML, Javascript 에 대한 개발지식만 가졌다면 아주 멋진 프로그램을 손 쉽게 만들 수 있다는 장점이 있지만 가장큰 단점으론 .. CEF(Chrome Embed Framework:크로미움기반)기반의 일렉트론 같이 어찌됫던 웹브라우저를 틀로 사용하고 있음으로 기본적으로 프로그램의 크기가 100메가 이상이 넘어가고 내가 단순히 버튼하나 에디트박스 하나만 존재하는 프로그램을 만든다 하여도 이놈은 이미지, 동영상등 웹세상에서 존재하는 수많은 기능들을 다 내장한 상태로 돌아감으로 상대적으로 메모리 사용량이 높을 수 밖에 없습니다. 또한 경우에 따라서는 사양이 낮은 구형 컴퓨터나 구버전 윈도에선 제대로 실행조차 못할 수도 있습니다.

이러한 이유로 MS에서 제공하는 보편적으로 윈도에서 사용되는 사용자 인터페이스(UI)요소들을 사용하는게 큰 이점이 될수도 있는것이지요. 보통 네이티브 스피커를 원어민 이라고 하듯이 네이티브 GUI 라고 하자면 그 OS의 제조사에서 제공하는 GUI구성 요소를 사용하는 개발방법? 그정도로 이해하시면 되겠습니다.

장점으로는 UI 구성에 필요한 무언가들은 이미 OS가 가지고 있음으로 실행파일이 매우 작습니다. 몇 메가면 충분하고 메모리 사용량 자체도 몇십메가 수준이면 충분하지요. 

네이티브 GUI에 대한 이야긴 여기까지 하구요.

Go는 C언어 코드를 바로 사용가능한 cgo 라는 체계도 가지고 있고 윈도 DLL들을 다룰수 있는 다양한 방법 또한 제공하는 언어라서.. DLL기반으로 동작하는 윈도 GUI 관련 API 들도 사용이 가능합니다만. 그걸 직접 다 한땀 한땀 ;; define 이나 각종 상수들을 다 포팅해서 뭔가를 하기엔 귀찮죠.. 그리하야 그러한 짓을 미리 해주신 능력자 분들의 패키지를 끌어다 씁니다.

lxn 의 win 과 walk 이 2가지를 가지고 뭔가를 할 건데요 .. 일단 두 패키지다 go get 해두시기 바랍니다.

win 패키지는 윈도 API의 각종 함수와 상수, define 들을 go로 바인딩 시켜둔 패키지이고 walk 패키지는 이 win 패키지를 랩핑(?)…. 이라고 하긴 좀 그렇고.. 기본적으로 윈도 API는 코드 작성 효율이 그리 좋은 방법은 아닙니다. 창하나 버튼하나 에디트박스 하나하나 전부다 하나의 윈도로 쳐서 CreateWindow함수로 객체 생성을 다 하고 그에 따른 메시지 프로시저를 다 따로 붙이고 하는 말도안되는 미친짓을 해야 하는게 윈도API로 윈도GUI어플리케이션을 개발한다 하는 것이거든요.. 

기껏 코드 작성의 고생을 좀 덜해보겠다고 쓰는게 Go같은 Managed 언어일진데.. C/C++에서 윈도API 가지고 하던 개삽질을 Go가지고 할꺼 같으면 .. 그냥 일렉트론 나부랭이들 가지고 웹기반으로 그냥 가라고 하고 말겠죠..

각설하고 .. 

여튼간에 lxn/win만 가지고 윈도 GUI 프로그래밍을 하는게 말도안되는 노가다인지라 이걸 좀더 편하게 쓰게 나온게 walk라는 패키지 입니다. 단순 Wrapper라고 하기엔 좀 애매하긴 하지만 여튼..  저는 이 Walk 라는 놈을 가지고 제 기준으로 좀 더 편하게 Gui 프로그램을 만들 수 있는 몇가지 함수등을 만들어서 사용중이구요. 그리하야 이 lxn의 win, walk 그리고 피로곰이 쓰는 WalkWrap.go 파일을 가지고 피로곰이 모두의 프린터, PDF의 윈도 GUI를 어케 만들었는가에 대해서 써보도록 하겠습니다.

다시 말씀드리지만 이건 강좌가 아닙니다. 그냥 .. 참고할람 하고 말람 마요.. 이게 최선이라 생각 해본적 없으니까 ㅎㅎ

GUI관련을 시작하기 전에 앞서 111GO의 다른 프로젝트에서도 다룬적 있지만 윈도용 프로그램을 만들기 위해서는 다른 콘솔용 Go프로그램 개발과는 몇가지 다른 과정이 필요합니다.

우선 콘솔용 프로그램과 윈도GUI 프로그램은 바이너리의 구성 자체가 다르기 때문에 메니페스트 정보를 포함한 시스템 오브젝트(syso) 파일이 필요하고 컴파일을 위한 빌드 옵션도 몇가지 추가 되어야 합니다.

우선 syso 파일을 위해선 

rsrc 패키지를 설치 하셔야 겠구요.

Bash
go get github.com/akavel/rsrc

두번째로 메니페스트(Manifest) 파일이 필요합니다.

XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="프로그램이름" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
        </windowsSettings>
    </application>
</assembly>

위의 내용을 복사해서 적당한 이름으로 저장하세요. 저는 보통 프로젝트명.manifest 라고 저장합니다.

설명을 위해서 프로젝트명은 DEMO라고 하겠습니다. rsrc 명령어 사용법은 아래와 같습니다.

Bash
rsrc -manifest 메니페이스파일명 -ico 아이콘파일명 -o 저장할syso파일명

프로그램의 아이콘을 지정하고 싶으시면 아이콘 파일도 포함해서 syso를 만들수 있는데요. 

Bash
rsrc -manifest DEMO.manifest -ico DEMO.ico -o DEMO.syso

이렇게 하면 DEMO.manifest 파일과 DEMO.ico 파일을 가지고 DEMO.syso 파일을 만들겠다! 라는 겁니다. 아이콘이 필요 없으시다면 ..

Bash
rsrc -manifest DEMO.manifest -o DEMO.syso

이렇게 -ico 구문만 제외시키시면 되겠습니다.

아이콘 파일 만들거나 찾기 귀찮으실 분들을 위해서 모두의 PDF의 아이콘을 올려둡니다.

DEMO.ico 다운로드

이 syso 파일은 go 컴파일러가 빌드시에 파일명 상관없이 syso파일을 뒤져서 알아서 실행파일에 합쳐주는데요 그런 이유로 한 폴더에 syso 파일은 한개 이상이 존재하면 안됩니다. 다수가 존재할 경우 오류가 날겁니다. 꼭 syso 파일은 폴더당 하나만 존재할 수 있다는거 .. 만약 빌드 옵션에 따라서 다른 아이콘이나 다른 메니페스트를 적용하고 싶으시면 Makefile이나 BAT파일로 자동화를 시키셔야 겠지요. 이건 각자의 몫이니까 패스..

syso 파일을 만들었으면 윈도 어플리케이션을 빌드하기 위한 빌드옵션에 대해서 알려드리겠습니다. 보통은 go 프로그램을 컴파일 할때는 

Bash
go build

거나 .. 출력 파일명을 지정하고 싶으면

go build -o DEMO.exe

이런식으로 파일명을 지정해서 빌드하실 텐데요.. 이렇게 빌드하면 흔히 말하는 콘솔 어플리케이션이 되버립니다.

이런식으로 PE32+ excutable (console) 이라고 콘.솔.용! 이라고 딱 표시됩니다. ( file 명령어는 리눅스 명령어라 일반 윈도에선 존재하지 않습니다. 저같이 msys2 같은걸 설치한 경우에나 사용가능합니다. file 명령어가 없어요~~ 라고 묻지좀 마요!)

반면 GUI를 가지는 윈도용 어플리케이션은 위와 같이 PE32+ excutable (GUI)라고 표시 되지요. 이렇게 컴파일을 하기 위해선 빌드시에 옵션을 추가로 지정하셔야 합니다.

Bash
go build -ldflags '-H windowsgui' -o DEMO.exe

이런식으로 -ldflags ‘-H windowsgui’ 옵션을 추가 하셔야 GUI용 바이너리로 컴파일 됩니다. 디버깅 심볼이 stripped 된 상태로 빌드하고 싶으신거면

Bash
go build -ldflags '-s -w -H windowsgui' -o DEMO.exe

이렇게 -s 와 -w 를 추가 하시면 되겠습니다.

시작하는데 필요한 기본적인 부분은 여기까지 설명 하겠구요. 

다음 글에서 이어가도록 하겠습니다.

많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

모두의프린터에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기