잡동사니/Go lang 4

Go in Windows - runtime.LockOSThread()

Go언어에서 IWebBrowser2 를 사용하는 프로그램을 만들었는데, 잘 실행되다가 갑자기 종료되는 현상이 있었다. 여러 가지 시도를 해봤는데 빈도의 차이가 있을 뿐 확실하게 해결되지 않았다. 10여일 간 검색과 시행착오를 반복한 끝에 드디어 답을 찾았다. 답은 바로 runtime.LockOSThread() 이다. IWebBrowser 사용 중에 Access violation(0xc0000005), Application hang(0xcfffffff) 등으로 비정상 종료되었는데 runtime.LockOSThread()를 main()에서 실행한 후에 해결되었다.

Go in Windows - Interface

Go언어에서 윈도 인터페이스를 구현하는 경우 매개 변수의 형식은 uintptr 또는 이와 같은 크기의 변수(int,uint,포인터)만 가능하다. HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ); 위의 경우를 Go언어에서 구현하면, 아래와 같은 형태가 된다. func Invoke(idMember int,riid *GUID,lcid uint,flags uint, dispParams *DISPPARAMS,varResult *VARIANT, excepInfo *EXCEPINFO..

Go in Windows - BSTR

Go언어에서 윈도 dll을 사용할 때 BSTR이라는 데이터 형식은 조금 다르게 처리해야 한다. BSTR은 uint16 값들의 배열을 가리키는 포인터로 생각할 수 있다. 한 가지 다른 점은 이 포인터 앞에 int32 값으로 문자열의 길이를 가지고 있다는 것이다. 이 때문에 BSTR을 Go언어의 *uint16으로 처리하는 경우 잘못된 메모리 접근(memory access violation)이 발생할 수 있다. 아래와 같은 코드는 제대로 동작할 수도 있고(길이값을 사용하지 않을 때), 아닐 수도 있다(길이값을 사용할 경우). func WrongBstr(s string) *uint16{ return syscall.StringToUTF16Ptr(s) } 대신에 윈도우의 SysAllocString 함수를 이용해야 ..

안드로이드폰 파일 싱크 프로그램

아이폰을 쓰다가 안드로이드폰으로 바꾸고 나서 불편했던 것 중에 하나가 사진을 컴퓨터로 옮기는 것이었다. 그래서 직접 만들어 봤다. 겸사겸사 Go언어도 공부했다. 그리하여 Go 언어를 공부하고서 처음 만든 프로그램. kfilesync [소스 파일] 컴퓨터에 핸드폰 연결하고 명령 프롬프트에서 kfilesync MTP0:\DCIM D:\Pictures 하면 끝. 혹시 필요한 분들이 있을까 하여 실행파일 공유합니다.