Sunday, September 11, 2022

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled

 

MyForm w = new MyForm

IntPtr handle = wnd.Handle;   // Exception occurs here

class MyForm : Form { ... }

protected override void WndProc(ref Message m) 

{
     if(m.Msg == 0x0072)
    {

    }
    // base.WndProc(ref m);   // Accidentally removed
}





실수로 base.WndProc 호출 부분을 지워버린 경우

이미 만든 윈도우이지만 핸들 참조 자체가 안 된다.

단순 핸들 참조에도 WndProc이 돌아가는 마법





Handle leak일 리가 없는데 이런 오류를 만난다면 대개 이런 것이다.

Saturday, February 19, 2022

Extension Method에서 ref를 쓸 수 있는가?

C# 7.2부터 쓸 수 있다.

VS 2019 기본 설정으로는 못 쓴다.


예전 MSDN community에서는 그딴 게 왜 필요함? 이러고 있었는데

이럴 때 있으면 좋을 것 같지 않은가?

WndA ctrl1;

WndB ctrl2;
private void menuItem1_Click(object sender, EventArgs e)
{
  if (ctrl1== null || ctrl1.IsDisposed)
  {
    ctrl1= new WndA();
    ctrl1.Show();
  }
  else { ctrl1.BringToFront(); }
}
private void menuItem2_Click(object sender, EventArgs e)
{
  if(ctrl2==null || ctrl2.IsDiposed)
  {
    ctrl2 = new WndB();
    ctrl2.Show();
  }
  else { ctrl2.BringToFront(); }
}

public static void OpenSingletonWindow<T>(this ref T c) where T : Control, new()
{
  if(c==null || c.IsDisposed) {c=new T(); c.Show();}
  else { c.BringToFront(); }
}

Extension method는 null에서도 잘 실행되니까(virtual call이 아님: Stackoverflow)
Control c = null;
c.OpenSingletonWindow(); 
해도 잘 실행됐을 것이다(this ref가 가능했다면).

Extension method 없이 static class로 하면
SomeUglyStaticClassName.OpenSingletonWindow(ref ctrl);
이렇게 한다. 쓰고 보니 별 차이가 없긴 하다.



굳이 못하게 막아놓은 이유는 또 뭐람

Wednesday, September 1, 2021

갑자기 Step Into가 안될 때

요약: Short-circuit 당해서 그냥 step into 안 해버리는 경우가 있다.


원래 이랬던 프로그램을

void f1() { /* do something */ }

void f2() { }

void f3() {}

void f() {f1(); f2(); f3(); }

이것을 각 단계 별로 실행하다 한 번이라도 실패하면 바로 중단하기 위해서 bool을 리턴하게 바꿨다:

bool f1r() { /*Side effects*/ if(...) return true; else return false; }

bool f2r() { /*Side effects*/ if(...) return true; else return false; }

bool f3r() { /*Side effects*/ if(...) return true; else return false; }

그리고 중간에 모종의 이유로,
일단 f1, f2, f3를 무조건 다 실행시키고 b값을 마지막에 비교하기로 계획을 바꾼다(if(!b) return 주석화).

void f() {

 bool b = f1(); 

 // if(!b) return;  

 b = b && f2();

// if(!b) return;

 b = b && f3();

// if(!b) return;

// Do rest

}

그랬더니 f2, f3가 실행되지 않았다. 그래서 디버깅을 했더니 step into가 먹히지 않는 것이다!

 f1, f2, f3가 위치한 행에서 step into (F11)를 시도하면 break point를 무시한다. f1/f2/f3 내부에 break point를 둬도 무시한다.

그리고 더 무서운 것은 이것이 "intermittent"하게 일어난다는 것이다.
(사실 b = false일 때만 무시되는 것)




Visual studio 임시 파일 지우고 이것저것 해 보기 전에...

* 다른 함수에 대해서는 step into가 잘 작동하는 지 확인해 보자.

* 함수의 반환값은 무적권 별도의 변수로 저장하는 게 디버깅하기에 좋다.

* 원래의 의도와 다르게 뭔가를 사용할 때는 문제가 생기기 쉽다(...)


예전에도 이거 당했는데 또 당하면 매우 억울하다. 하하

Thursday, January 14, 2021

ListView에서 Column Headers 표시되지 않는다 왜?

외부 코드에서 ctrl-C ctrl-V로 가져온 경우에

OwnerDraw가 true가 아닌 지 확인해 보자. false로 바꾸면 잘 나올 것이다.

OwnerDraw==true인 경우 DrawColumnHeader, DrawItem, DrawSubItem events에 대한 handers 구현해야 한다.

Item/SubItem은 대개 스스로 구현하겠지만 header에 대해서는 default로 충분할 텐데,

        private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)

        {

            e.DrawDefault = true;

        }


이전 프로젝트에서 OwnerDraw를 구현해 뒀다가 오랜만에 꺼내서 쓰려고 할 때 이런 일이 생길 수 있다.



그 밖에 흔히들 하는 실수는 

 * View property가 Details로 맞춰져 있지 않은 경우

 * listView1.Items.Clear() 하지 않고 listView1.Clear() 해 버리는 경우 

등이 있다.

Tuesday, December 29, 2020

Windows 10 20H2 업데이트 후 그림/동영상 파일 미리보기가 안 보인다면

 파일 탐색기 옵션에서 '미리 보기에 파일 아이콘 표시' 항목에 체크돼 있다면 해제한다.

기본값이 (미리보기 대신) 아이콘 표시로 바뀐 듯하다.



파일 탐색기 옵션은 제어판 항목 중에도 있고, 탐색기 창의 메뉴(보기 탭 속)에도 있다.



몇 달 간 포기하고 살다가 지금 고침 훠훠

Thursday, August 27, 2020

아이폰 핫스팟 USB 연결 Windows 10 설치 (iTunes 전체 설치 없이)

1. 아이튠즈 다운로드

https://www.apple.com/kr/itunes/download/


1-0) 흑우 같이 검정색 Get it from Microsoft 버튼 누르고 스토어 들어가지 말고

1-1) 아래로 내려가서 다른 버전을 찾고 있다면? Windows를 클릭

1-2) 앞의 Get it from MS 버튼이 지금 다운로드하기(64비트) 하늘색 버튼으로 바뀐다.

  (위아래로 오르락내리락 하게 만들었다 나쁜놈들...)

1-3) iTunes64Setup.exe 파일이 다운로드된다.


2. 압축 풀기

2-0) 혹시 exe 속을 열어볼 압축 프로그램이 없다면 하나 설치한다(eg, 7-zip).

2-1) 7-Zip Context menu에서 "iTunes64Setup\"에 풀기 선택

2-2) 열어 보면 여러 개가 있는데 이 중 필요한 것은

 * AppleApplicationsSupport64.msi

 * AppleMobileDeviceSupport64.msi

두 개다(2020년 8월 27일 현재. 예전에는 mobile device support만 설치해도 됐는데 ㅗ). 

차례대로 설치(오른쪽 클릭, 설치)한다.

 - AppleApplicationSupport64.msi를 설치하지 않으면 Apple Mobile Device Service 서비스가 시작하지 않는다.

2-3) Windows 재시작이 필요하다.


3. iPhone Wifi 끄고 핫스팟 켜고 PC에 연결하면 유선으로 연결된다.

# 왜 유선으로 연결하느냐 하면 

아이폰은 원래 Wifi 핫스팟이 간헐적으로 끊어지기 때문입니다(이 글을 쓴 목적).

원래 그렇게 쓰는 겁니다.





역병 같은 존재 iTunes (Windows 버전)

×

역병 같은 존재 Microsoft Store

= iTunes 전체 설치 

하는 흑우 없제?

Sunday, June 21, 2020

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...