C#2010. 7. 28. 17:51

#. 내용.
 - 외부 라이브러리를 사용하기 위한 선언입니다. Dll 파일을 C# 프로젝트가 인식할 수 있도록 해야 하며 대게 해당 파일을 C:/Program Files/ 내지는 프로젝트 내의 bin/debug 또는 bin/release에 복사해 두면 됩니다.

#. 사용 방법.
using System.Runtime.InteropServices; //선언

//사용하고자 하는 dll 파일을 첫번째 인수에 넣음.
[DllImport("user32.dll")]

//public 및 static의 정적 메소드로 선언해야 하고, extern 한정자는 메소드가 C# 코드 외부에서 구현됨을 나타 냅니다.
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
.
.
.
//이런 식으로 사용하면 됩니다.
hHook = SetWindowsHookEx(WH_MOUSE, MouseHookProcedure, (IntPtr)0, AppDomain.GetCurrentThreadId());

#. 주의사항.
 - 인자값과 리턴 값의 자료형을 정확하게 맞춰줘야 합니다. 그렇지 않을 경우 데이터를 주고 받다가 데이터가 소실되는 경우가 발생합니다.

Posted by 쿵캉켕
C#2010. 6. 15. 14:39

#. 내용.
 - C#에서 포인터를 사용하면 불안전한 코드가 됩니다. C#은 CLR이 메모리를 자동으로 관리해 주는데 포인터는 사용자가 직접 메모리를 건들이기 때문에 불안전코드가 되는 것입니다. 이 상태에서 실행하면 컴파일 오류가 발생합니다. 이때 unsafe키워드를 사용하면 포인터를 사용할 수 있습니다.

#. 방법.
1. unsafe 키워드를 함수 앞에 명시.
 - 함수의 매게변수와 함수의 끝부분까지 포인터를 사용할 수 있습니다.
 ex)
   unsafe static void PointerMethod(int* x)
   {
          *x = 1000;
    }
2. unsafe 블록을 설정.
 - 블록 내에서 포인터를 사용할 수 있습니다.
 ex)
   public static void Start()
   {
       int x1 = 10;
       unsafe
       {
           PointerMethod(&x1);
       }
       MessageBox.Show(x1.ToString());
  }

Posted by 쿵캉켕
C#2010. 5. 26. 17:22

#. C#에서 FlexGrid를 사용하는 경우 소스상에서 Column을 설정하는 방법 중 하나를 기술합니다. 이 변수에 대해 모든 것을 파악하지는 못했지만 현재 제가 파악한 부분만이라도 먼저 기술해 놓겠습니다. 만약 다른 기능을 알고 계시다면 답글 달아주시면 감사하겠습니다요.


1. 첫번째 숫자 3은 컬럼 수를 나타냅니다.
2. 6번째 숫자 0은 각 컬럼의 가로크기를 일괄적으로 설정할 때 사용합니다.
3. Columns 뒤에 0, 1, 2 는 각 컬럼에 대한 세부 설정 입니다. 지금 설정된 값 외에도 정렬방법, 편집 여부 등을 설정할 수 있습니다.
 - Width: 가로크기.
 - Caption: 컬럼 명.

※ FlexGrid.ColumnInfo의 경우는 VS 2005에서 미리보기가 지원되지 않기 때문에 나오지 않더라도 당황마시고 입력하세요. 입력이 끝난 뒤 마우스 커서를 올리면 말풍선이 뜹니다.

Posted by 쿵캉켕
C#2010. 4. 23. 19:55

#. 내용.
  닷넷 UI를 사용하는 프로그램을 제작하다가 이런 메시지를 보았습니다.
 - "크로스 스레드 작업이 잘못되었습니다. 'm_listBoxMessages' 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다."

  FTP Server를 제작하는 도중에 윈도우 폼에서 listBox컨트롤을 사용하였는데, TcpListener를 사용하는 Thread 안에서 Handler 클래스를 호출하면 Handler 클래스 내에 등록한 이벤트가 발생하여 윈도우 폼에 있는 listBox에 메시지를 출력하는 경우였습니다. 컴파일을 한 경우 정상적으로 실행되지만 디버깅모드에 들어가면 저 메시지가 출력 되더군요.

  네이년을 뒤져보니 다음 해결방법을 찾았습니다. 그 해결방법에 따라 소스를 아래와 같이 변경하였더니 정상적으로 디버깅 됩니다. 방법은 delegate를 선언하여 다르 스레드에서 Control을 호출하는경우 Invoke로 그 함수를 다시 호출하는 거죠. 아래 방법을 보시면 도움이 되실겁니다.

#. 방법.
public partial class FTPServerForm : Form
{
        //System.InvalidOperationException처리를 위한 delegate 선언.
        delegate void SetMessageHandler(int nID, string strMessage);
        .
        .
        .
        .

       //delegate를 사용하여 Control의 InvokeRequired속성이 true일 경우
     //Form에서 Invoke 함수로 해당 함수를 다시 호출.

        void FtpServerMessageHandler_Message(int nID, string strMessage)
        {
            if (this.m_listBoxMessages.InvokeRequired)
          {
                SetMessageHandler message = new SetMessageHandler(FtpServerMessageHandler_Message);
                this.Invoke(message, new object[] { nID, strMessage });
            }
            else
            {
                //실제 listBox에서 출력되는 부분.
                .
                .
                .
                .
             }
        }
}


※. 꼭 같은 경우는 아니지만 크로스 스레드 작업 시 해당 윈폼의 생성자에다가 CheckForIllegalCrossThreadCalls = false;를 넣어 줘도 되는 경우가 있습니다.

Posted by 쿵캉켕
C#2010. 4. 7. 15:51

#. 내용.
 - 지정된 하위 키를 검색합니다.
 
#. 사용방법.
 - C#에서 레지스트리 관련 접근을 하려면 Microsoft.Win32에 있는 RegistryKey 패키지를 이용하여 접근하여야 합니다.
 - 코드 맨 위에 using Microsoft.Win32;를 선언한 후 접근합니다.

#. 오버로드 목록.
 - Registry.OpenSubKey(String): 하위 키를 읽기 전용으로 검색합니다.
 - Registry.OpenSubKey(String, Boolean): 지정된 하위 키를 검색합니다.
 - RegistryKey.OpenSubKey (String, RegistryKeyPermissionCheck): 읽기 또는 읽기/쓰기 권한으로 지정된 하위 키를 검색합니다. 
 - RegistryKey.OpenSubKey (String, RegistryKeyPermissionCheck, RegistryRights): 지정된 액세스 권한을 요청하여 읽기 또는 읽기/쓰기 권한으로 지정된 하위 키를 검색합니다.

#. 파라미터.
 - String: 열려고 하는 하위 키의 이름 또는 경로입니다.
 - Boolean: 키에 대한 쓰기 권한이 필요하면 true로 설정합니다.
 - RegistryKeyPermissionCheck: 키가 읽기 또는 읽기/쓰기 권한으로 열려 있는지 여부를 지정하는 값 중 하나입니다
 - RegistryRights: 원하는 보안 액세스를 지정하는 RegistryRights 값의 비트 조합입니다.

#. 반환 값.
 - 요청된 하위 키를 나타내는 RegistryKey 개체이거나, 작업에 실패하면 Null 참조(Visual Basic의 경우 Nothing)입니다.

Posted by 쿵캉켕
C#2010. 3. 31. 17:53

#. 내용.
 - 특정 인코딩으로 입력된 문자를 읽을 수 있습니다. StreamReader를 사용하여 표준 텍스트 파일에서 정보 줄을 읽습니다. 별도로 지정하지 않으면 StreamReader는 기본적으로 현재 시스템의 ANSI 코드 페이지 대신 UTF-8 인코딩으로 지정됩니다. UTF-8은 유니코드 문자를 정확하게 처리하고 운영 체제의 지역화된 버전에 대한 일관성 있는 결과를 제공합니다.

#. 사용예제
 - StreamReader sr = new StreamReader("FilePath", Encoding);

Posted by 쿵캉켕