GSI

POST로 데이터를 보낼때 NSDictionary를 사용하면 되는데 스타일은
아래의 코드와 같이 실제 값이 앞에 가고 뒤에 이름이 들어간다.

[뷰에 클릭후 http를 생성 및 초기 코드]

// url 문자열을 이용하여 HTTP 웹사이트에 접속

- (void)requestUrl {

    // 접속할 주소 설정

    NSString *url = @"http://사용자의 웹 페이지 주소";

    

    // HTTP Request 인스턴스 생성

    HTTPRequest *httpRequest = [[HTTPRequest alloc] init];

    

    // POST 전송할 데이터 설정

    NSDictionary *bodyObject = [NSDictionary dictionaryWithObjectsAndKeys:

@"38.0", @"latitude"

@"127.0", @"longitude",

nil];

//NSString *bodyObject = @"type=getUser&seq=1&latitude=38.0&longitude=127.0&time=13600&unit='k'&distance=9999";

    

    // 통신 완료 호출할 델리게이트 셀렉터 설정

    [httpRequest setDelegate:self selector:@selector(didReceiveFinished:)];

    

    // 페이지 호출

    [httpRequest requestUrl:url bodyObject:bodyObject];

//

[spinner startAnimating];

}


아래 코드들은 클래스 생성후에 내용을 추가 해야 합니다.
[HTTPRequest.h]

#import <Foundation/Foundation.h>



@interface HTTPRequest : NSObject

{

    NSMutableData *receivedData;

    NSURLResponse *response;

    NSString *result;

    id target;

    SEL selector;

}


- (BOOL)requestUrl:(NSString *)url bodyObject:(NSDictionary *)bodyObject;

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse;

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

- (void)setDelegate:(id)aTarget selector:(SEL)aSelector;


@property (nonatomic, retain) NSMutableData *receivedData;

@property (nonatomic, retain) NSURLResponse *response;

@property (nonatomic, assign) NSString *result;

@property (nonatomic, assign) id target;

@property (nonatomic, assign) SEL selector;


@end



[HTTPRequest.m]

#import "HTTPRequest.h"


@implementation HTTPRequest


@synthesize receivedData;

@synthesize response;

@synthesize result;

@synthesize target;

@synthesize selector;


- (BOOL)requestUrl:(NSString *)url bodyObject:(NSDictionary *)bodyObject

{

    // URL Request 객체 생성

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]

                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy

                                                       timeoutInterval:5.0f];

    

    // 통신방식 정의 (POST, GET)

    [request setHTTPMethod:@"POST"];

    

    // bodyObject 객체가 존재할 경우 QueryString형태로 변환

    if(bodyObject)

    {

        // 임시 변수 선언

        NSMutableArray *parts = [NSMutableArray array];

        NSString *part;

        id key;

        id value;

        

        // 값을 하나하나 변환

        for(key in bodyObject)

        {

            value = [bodyObject objectForKey:key];

            part = [NSString stringWithFormat:@"%@=%@", [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

[value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

            [parts addObject:part];

        }

        

        // 값들을 & 연결하여 Body 사용

        [request setHTTPBody:[[parts componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding]];

    }

    

    // Request 사용하여 실제 연결을 시도하는 NSURLConnection 인스턴스 생성

    NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

    

    // 정상적으로 연결이 되었다면

    if(connection)

    {

        // 데이터를 전송받을 멤버 변수 초기화

        receivedData = [[NSMutableData alloc] init];

        return YES;

    }

    

    return NO;

}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse

{

    // 데이터를 전송받기 전에 호출되는 메서드, 우선 Response 헤더만을 먼저 받아 온다.

    //[receivedData setLength:0];

    self.response = aResponse;

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    // 데이터를 전송받는 도중에 호출되는 메서드, 여러번에 나누어 호출될 있으므로 appendData 사용한다.

    [receivedData appendData:data];

}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    // 에러가 발생되었을 경우 호출되는 메서드

    NSLog(@"Error: %@", [error localizedDescription]);

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    // 데이터 전송이 끝났을 호출되는 메서드, 전송받은 데이터를 NSString형태로 변환한다.

    result = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

    

    // 델리게이트가 설정되어있다면 실행한다.

    if(target)

    {

        [target performSelector:selector withObject:result];

    }

}


- (void)setDelegate:(id)aTarget selector:(SEL)aSelector

{

    // 데이터 수신이 완료된 이후에 호출될 메서드의 정보를 담고 있는 셀렉터 설정

    self.target = aTarget;

    self.selector = aSelector;

}


- (void)dealloc

{

    [receivedData release];

    [response release];

    [result release];

    [super dealloc];

}


@end


 
Posted by gsi
:


MFC의 Dialog 베이스를 사용해서 폼을 하나 제작합니다.
그리고 picture Box 를 하나 제작한 후에 CxImage를 사용해서 png 파일을 하나 로드 한후에
picture Box에 SetBitmap 를 하고 나서 이걸 다른 형태로 테스트를 진행해 봤습니다.

기본 코드는 아래와 같아요.

// CxImage 객체 생성
m_pImage = new CxImage("D:\\Test.png", CXIMAGE_FORMAT_PNG);

// PictureBox 컨트롤에 CxImage 이미지 연동
m_pic.SetBitmap( m_pImage->MakeBitmap() );

이렇게 하고 나서 실행 하고, 종료 하게 되면 크게 문제는 안되는듯 하다.

이걸 다른 형태로 테스트를 해봤다.
타이머를 통해서 CxImage 객체 두개의 Bitmap를 m_pic(PictureBox) 컨트롤에 SetBitmap를 반복해서 처리해봤다.

void CPngToBitmapDlg::OnTimer(UINT nIDEvent)
{
 static bool bFirst = false;
 static HBITMAP hBitmap = NULL;

 if( bFirst == false )
 { 
  hBitmap = m_pic.SetBitmap( m_pImage2->MakeBitmap() );
 }
 else
 {
  hBitmap = m_pic.SetBitmap( m_pImage->MakeBitmap() );
 }

 ::DeleteObject( hBitmap );

 //
 bFirst = !bFirst;

 m_loopCount++;
 UpdateData(false);
 

 CDialog::OnTimer(nIDEvent);
}

위의 붉은색 코드를 하지 않고 계속해서 SetBitmap을 하게 되면
페이지파일(PF)가 계속 증가 하는 것을 볼 수 있다.

앞으로 코드 구현을 할때 하나 하나 단위테스트를 통해서 반복적인 메모리 및 GDI 사용량 등을
체크 하고 좀 안정성 있는 프로그램을 하도록 해야 할거 같다.

Posted by gsi
:


참고자료 : http://www.codeproject.com/KB/cs/control_e_appliances.aspx

1. hwinterface.ocx 를 regsvr32 를 통해서 등록한다.
2. Visual Studio 의 도구 상자에서 ocx 를 등록한다.
   - Hwinterface Control의 activex 컨트롤이 생긴다.
3. 해당 폼으로 가져와서 인스턴스를 생성한다.
4. 나머지 코드는 참고 자료의 링크에 존재 하는 파일을 참고 하기 바람

Posted by gsi
:

MD5 샘플 코드

C# 2009. 12. 23. 13:44 |


--선언--
using System.Security.Cryptography;

--코드--
        #region MD5 메소드
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

        #region MD5 테스트 블록
        private void button1_Click(object sender, EventArgs e)
        {
            // 암호화 문자열을 가져온다.
            string convmd5 = getMd5Hash(textBox1.Text);

            // 암호화된 내용을 출력한다.
            textBox2.Text = convmd5;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 해당 문자열을 가져와서 암호화된 내용과 비교 한다.
            if (verifyMd5Hash(textBox3.Text, textBox2.Text) == true)
            {
                MessageBox.Show("맞습니다.");
            }
            else
            {
                MessageBox.Show("틀립니다.");
            }
        }
        #endregion

Posted by gsi
:


WebBrowser를 사용해야 되는 부분이 생겨서
많이 자료를 보고 해봤지만 TopMost라는 특성 때문에 Winform, WPF 모두
원하는 효과를 낼수가 없더라구요.

그래서 여러가지 보고 테스트도 해봤지만.
어떤건 속도가 너무 느리더라구요.

아래 코드는 완전 해결한건 아니지만,
이것도 조금은 접근이 된거 같아요.

목표점은
- 스레드를 통한 백그라운드 처리를 통해서 다른 UI의 동작을 원할하게 처리
-  모자이크 처리로 화면에 출력함으로 해서 조금은 이펙트를 중점으로 한다.

아래의 코드는 일부 접근된 코드를 우선 올려 봅니다.

-- Code --
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Media;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        WebBrowser web = new WebBrowser();

        public Form1()
        {
            InitializeComponent();

            web.Width = 1000;
            web.Height = 1000;
            web.ScrollBarsEnabled = false;
            web.ScriptErrorsSuppressed = true;
            web.Navigate("http://dev.iamgsi.com/googlemap");

            timer1.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //while (web.ReadyState != WebBrowserReadyState.Complete)
            //    System.Windows.Forms.Application.DoEvents();
            //System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));

            int width = web.Document.Body.ScrollRectangle.Width;
            int height = web.Document.Body.ScrollRectangle.Height;
            web.Width = width;
            web.Height = height;

            System.Drawing.Bitmap bmp = new Bitmap(width, height);
            web.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, width, height));

            this.pictureBox1.Width = width;
            this.pictureBox1.Height = height;
            if (this.pictureBox1.Image != null)
            {
                this.pictureBox1.Image.Dispose();
            }
            this.pictureBox1.Image = null;
            this.pictureBox1.Image = bmp;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            web.Document.InvokeScript("MoveAddress", new object[] { "서울" });
        }

        private void button3_Click(object sender, EventArgs e)
        {
            web.Document.InvokeScript("MoveAddress", new object[] { "거창" });
        }

        private void button4_Click(object sender, EventArgs e)
        {
            web.Document.InvokeScript("MoveAddress", new object[] { "광주" });
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (web.ReadyState != WebBrowserReadyState.Complete)
                return;

            int width = web.Document.Body.ScrollRectangle.Width;
            int height = web.Document.Body.ScrollRectangle.Height;
            web.Width = width;
            web.Height = height;

            System.Drawing.Bitmap bmp = new Bitmap(width, height);
            web.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, width, height));

            this.pictureBox1.Width = width;
            this.pictureBox1.Height = height;
            if (this.pictureBox1.Image != null)
            {
                this.pictureBox1.Image.Dispose();
            }
            this.pictureBox1.Image = null;
            this.pictureBox1.Image = bmp;
        }
    }
}

Posted by gsi
: