[.Net] pinvoke.net

.Net/.Net 2013. 1. 7. 16:46

링크 : http://www.pinvoke.net/index.aspx 

 

win32 API 를 .Net에서 사용할때 .Net에 맞게 DllImport를 해야 하는데 그 변환 문법이 만만치 않다.

각 함수별로 잘 정리되어 있는 사이트

 

* 사이트 메인 화면을 보면 Visual Studio 2010, 2012 Add-In 프로그램도 존재한다. Winform으로 개발시 유용할듯

'.Net > .Net' 카테고리의 다른 글

[.Net] Aspect Oriented Programming With .Net  (0) 2013.01.14
[.Net] 웹 자동화 구현 클래스  (0) 2013.01.09
[.Net] Windows 서비스 응용 프로그램  (0) 2012.12.07
[.Net] Zlib Wrapper  (0) 2012.05.22
[.Net] Inter-Process Communication  (0) 2012.04.17
posted by 뚱2

Win32 네트워크 프로그래밍

Books 2009. 9. 7. 14:46

1. 제   목 : Win32 네트워크 프로그래밍
2. 출판사 : 대림
3. 저   자 : Ralph Davis 저 / 김승태 역
4. 가   격 : 29,000원
5. 난이도 : 중급 (☆★★★☆)
6. 판   매 : 품  절
7. 평   가 : ★★★☆☆

    네트워크 책이지만 시스템에 대한 설명도 많은 책입니다.
    오래된 책이라서 내용이 조금 구식(?)이지만 내용의 질만큼은 좋아서 초보분들이
    개념잡기 좋습니다. 번역도 대체적으로 이해하는데 무리 없이 잘 번역되어 있습니다.
    특히 Win32 API를 이용해서 클래스로 만든 CWin32Exception, COverlappedFile은 바로 실무에서
    사용할수 있습니다.
posted by 뚱2

동기화 모드로 InternetOpenUrl 함수를 사용하다 보니 블러킹 상태에 대한
조치가 필요해서 InternetSetOption 함수의 Timeout 인자를 설정했지만
안먹더군요... 그래서 인터넷을 뒤진 결과 MS 버그 ㅡㅡ;
결국 MS에서 알려준 방법대로 스레드로 처리하긴 했습니다.
뭐 이건 배보다 배꼽이 더큰 경우라고 할 수 있네요...
#include "windows.h"
#include "wininet.h"
#include "iostream.h"

DWORD WINAPI WorkerFunction( LPVOID ); 
HINTERNET g_hOpen, g_hConnect;

typedef struct 
{
   CHAR* pHost;
   CHAR* pUser;
   CHAR* pPass;
} PARM;

void main()
{
   CHAR    szHost[] = "localhost";
   CHAR    szUser[] = "JoeB";
   CHAR    szPass[] = "test";
   CHAR    szLocalFile[] = "localfile";
   CHAR    szRemoteFile[] = "remotefile";
   DWORD   dwExitCode;
   DWORD   dwTimeout;
   PARM    threadParm;

   g_hOpen = 0;
   if ( !( g_hOpen = InternetOpen ( "FTP sample", 
                                    LOCAL_INTERNET_ACCESS, 
                                    NULL, 
                                    0, 
                                    0 ) ) )
   {         
       cerr << "Error on InternetOpen: " << GetLastError() << endl;
       return ;
   }

   // Create a worker thread 
   HANDLE   hThread; 
   DWORD    dwThreadID;
   threadParm.pHost = szHost;
   threadParm.pUser = szUser;
   threadParm.pPass = szPass;

   hThread = CreateThread(
                 NULL,            // Pointer to thread security attributes 
                 0,               // Initial thread stack size, in bytes 
                 WorkerFunction,  // Pointer to thread function 
                 &threadParm,     // The argument for the new thread
                 0,               // Creation flags 
                 &dwThreadID      // Pointer to returned thread identifier 
             );    

   // Wait for the call to InternetConnect in worker function to complete
   dwTimeout = 5000; // in milliseconds
   if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
   {
       cout << "Can not connect to server in " 
            << dwTimeout << " milliseconds" << endl;
       if ( g_hOpen )
InternetCloseHandle ( g_hOpen );
       // Wait until the worker thread exits
       WaitForSingleObject ( hThread, INFINITE );
       cout << "Thread has exited" << endl;
       return ;
   }

   // The state of the specified object (thread) is signaled
   dwExitCode = 0;
   if ( !GetExitCodeThread( hThread, &dwExitCode ) )
   {
       cerr << "Error on GetExitCodeThread: " << GetLastError() << endl;
       return ;
   }

   CloseHandle (hThread);
   if ( dwExitCode )
   // Worker function failed
      return ;

   if ( !FtpGetFile ( g_hConnect, 
                      szRemoteFile,
                      szLocalFile,
                      FALSE,INTERNET_FLAG_RELOAD, 
                      FTP_TRANSFER_TYPE_ASCII,
                      0 ) )
   {
       cerr << "Error on FtpGetFile: " << GetLastError() << endl;
       return ;
   }

   if ( g_hConnect )
       InternetCloseHandle( g_hConnect );
   if ( g_hOpen )
       InternetCloseHandle( g_hOpen );

   return ;
}

/////////////////// WorkerFunction ////////////////////// 
DWORD WINAPI 
WorkerFunction(
   IN LPVOID vThreadParm
)
/*
Purpose:
   Call InternetConnect to establish a FTP session  
Arguments:
   vThreadParm - points to PARM passed to thread
Returns:
   returns 0  
*/ 
{
   PARM* pThreadParm;
   // Initialize local pointer to void pointer passed to thread
   pThreadParm = (PARM*)vThreadParm;
   g_hConnect = 0;

   if ( !( g_hConnect = InternetConnect (
                            g_hOpen, 
                            pThreadParm->pHost,
                            INTERNET_INVALID_PORT_NUMBER,
                            pThreadParm->pUser,
                            pThreadParm->pPass,
                            INTERNET_SERVICE_FTP, 
                            0,
                            0 ) ) )
   {
       cerr << "Error on InternetConnnect: " << GetLastError() << endl;
       return 1; // failure
   }
   
   return 0;  // success
}

원본은 요기 ↓
http://support.microsoft.com/default.aspx?scid=kb;en-us;224318

posted by 뚱2

WM_DESTROY 메세지

OS/Windows 2008. 7. 21. 10:18

WM_DESTROY 메세지는 윈도우가 파괴될때 발생합니다.
윈도우가 파괴되는 경우는 Alt+F4, 종료버튼을 누를때 입니다.
특이한 점은 윈도우 구조체가 메모리 해제되고 나서 이 메세지가 발생합니다.
따라서 WM_DESTROY에서 DC를 얻어서 그리기를 시도하면 실패합니다.

윈도우 종료시에 마지막으로 그리기 작업이 필요하다면 WM_CLOSE에서
해주셔야 합니다. 이 메세지는 윈도우 구조체를 메모리 해제하기 바로 전에
발생하는 메세지 입니다. 따라서 DC를 정상적으로 얻을수 있습니다.

WM_DESTROY는 DC와 연관되지 않은 데이터 정리 작업을 하기 좋은 곳 입니다.

posted by 뚱2

유용한 NETSTAT 명령어

Network 2008. 7. 14. 14:42

소켓프로그램을 개발할때 포트 확인시 유용합니다.

LISTENNING 대기상태인 포트
ESTABLISHED 연결상태인 포트
TIME-WAIT 연결종료 중인 포트 (TCP/IP의 TIME-WAIT 상태)
CLOSED 연결 종료된 포트

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p 프로토콜] [-r] [-s] [-t] [-v] [시간]
  -a 모든 연결 수신 대기 포트를 표시합니다.
  -b 연결 또는 수신 대기 포트를 만드는 관련된 실행 프로그램을
표시합니다. 알려진 실행 프로그램에서 여러 독립 구성 요소를
호스팅하는 경우에는 연결 또는 수신 대기 포트를 만드는
관련된 구성 요소의 시퀀스가 표시됩니다. 이런 경우에는
실행 프로그램 이름이 아래쪽 대괄호 안에 표시되어 있고 위에는
TCP/IP 도달할 때까지 호출된 구성 요소가 표시되어 있습니다.
옵션은 시간이 오래 걸릴 있으며 사용 권한이 없으면
실패합니다.
  -e 이더넷 통계를 표시합니다. 옵션은 -s 옵션과 같이 사용될
있습니다.
  -n 주소 포트 번호를 숫자 형식으로 표시합니다.
  -o 연결의 소유자 프로세스 ID 표시합니다.
  -p 프로토콜 지정한 프로토콜에 해당되는 연결을 표시합니다. 프로토콜은
TCP, UDP, TCPv6 또는 UDPv6 하나입니다. -s 옵션과 함께
사용하여 프로토콜별 통계를 표시할 경우 프로토콜은 IP, IPv6,
ICMP, ICMPv6, TCP, TCPv6, UDP 또는 UDPv6 하나입니다.
  -r 라우팅 테이블을 표시합니다.
  -s 프로토콜별로 통계를 표시합니다. 기본값으로 IP, IPv6, ICMP,
ICMPv6, TCP, TCPv6, UDP UDPv6 관한 통계를 표시합니다.
기본값의 하위 집합을 지정하는 -p 옵션을 사용할 있습니다.
  -t 현재의 연결 오프로드 상태를 표시합니다.
  -v  -b 옵션과 함께 사용하면 모든 실행 프로그램에 대한 연결
또는 수신 대기 포트를 만드는 관련된 구성 요소의 시퀀스를
표시합니다.

'Network' 카테고리의 다른 글

[KT EGG] 스트롱에그 KWD-B2600  (0) 2012.09.20
[Ping] KT 핑 테스트  (0) 2012.06.30
[Util] Ping Test Easy  (0) 2012.04.06
아이피 위치 확인 하는 방법  (0) 2012.02.07
hosts 파일 수정  (0) 2011.09.22
posted by 뚱2