레이블이 Winfrom인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Winfrom인 게시물을 표시합니다. 모든 게시물 표시

2017년 4월 3일 월요일

VB6 : 웹페이지 내용(Html) 불러 오기.

VB6 프로그램에서 특정 웹페이지의 내용을 불러 온다.


일단 참조를 하나 추가해야 한다.


참조에서 "Microsoft WinHTTP Service, version 5.1" 를 추가해주고....

Dim WinHttp As New WinHttpRequest

WinHttp.Open "GET", "http://daum.net"
WinHttp.Send

MsgBox WinHttp.ResponseText
이렇게 "WinHttpRequest" 로 특정 URL 을 호출한다.


그럼 이렇게 지정된 URL 의 내용을 텍스트로 가져 올수 있다.


VB6 : 날자, 시간 변경하기.

VB6 시스템의 시간 및 날자의 변경.
구문자체는 아주 간단하다.

Dim todayTime as String
todayTime = "2017-04-01 13:01:00"
DATE = Format(todayTime, "yyyy-MM-dd")
Time = Format(todayTime, "hh:mm:ss")

이렇게 간단히 시간과 날자를 바꿀수 있음.

단, 주의 할점은 Win7 이후의 운영체제에선 실행 프로그램이 "관리자 권한" 이 있을 경우에만 수정 가능하므로, 프로그램을 관리자 권한으로 실행 해야한다는 단점이 있다.

2017년 3월 20일 월요일

VisualStudio : 배포시 "서명하는 동안 오류가 발생했습니다. SignTool.exe를 찾을 수 없습니다."

배포시 "서명하는 동안 오류가 발생했습니다. SignTool.exe를 찾을 수 없습니다."


프로그램 서명 프로그램이 없어서 그런 것임.


"프로그램 및 기능" 페이지에서 Visual Studio 를 찾아 "변경" 을 선택.


"수정 / 복구 / 제거" 옵션이 나타나는데 여기서 "수정"을 선택.


그러면, "Windows 및 웹 개발" 항목에서 "ClickOnce 게시 도구" 가 체크 되어 있으 않은 것을 볼수 있을 것이다.

이걸 체크하고 업데이트를 해주면 정상적으로 인증 도구가 설치되고, 그러면 정상적으로 배포가 됨.


2017년 3월 6일 월요일

C# WinForm : 현재 프로그램이 실행 중인 컴퓨터의 아이피


현재 실행중인 프로그램이 돌아가고 있는 컴퓨터의 아이피를 가져 온다.


using System;
using System.Net;
using System.Net.Sockets;

namespace SelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = Client_IP;
            Console.WriteLine("This ip : {0}", url);
            Console.ReadLine();
        }

        public static string Client_IP
        {
            get
            {
                IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
                string ClientIP = string.Empty;
                for (int i = 0; i < host.AddressList.Length; i++)
                {
                    if (host.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        ClientIP = host.AddressList[i].ToString();
                    }
                }
                return ClientIP;
            }
        }
    }
}


이렇게 소스를 등록하고 "Client_IP" 를 호촐하면 아이피를 가져 온다.


2017년 2월 16일 목요일

C#, WinFom : 네트워크 드라이브 연결

네트워크 드라이브를 연결해 보자.



일단 프로젝트를 하나 생성하고 거기에 버튼을 등록해서, 그 버튼을 클릭하면 네트워크 드라이브를 연결하는 프로그램을 만들어 본다.

그리고 클래스를 하나 등록.
클래스 명은 그냥 쓰기 편한 걸로...



물론 이렇게 안하고, 메인 폼에서 바로 작성 해도 되지만, 클래스를 하나 등록해서 하는게 나중에 두고 두고 써먹기 좋음.

그리고 그 클래스에 소스를 똭...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.InteropServices;

namespace NetDrive
{
    class csNetDrive
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct NETRESOURCE
        {
            public uint dwScope;
            public uint dwType;
            public uint dwDisplayType;
            public uint dwUsage;
            public string lpLocalName;
            public string lpRemoteName;
            public string lpComment;
            public string lpProvider;
        }

        // Net Drive 연결
        [DllImport("mpr.dll", CharSet = CharSet.Auto)]
        public static extern int WNetUseConnection(
            IntPtr hwndOwner,
            [MarshalAs(UnmanagedType.Struct)] ref NETRESOURCE lpNetResource,
            string lpPassword,
            string lpUserID,
            uint dwFlags,
            StringBuilder lpAccessName,
            ref int lpBufferSize,
            out uint lpResult);

        // Net Drive 연결
        public int setRemoteConnection(string strRemoteConnectString, string strRemoteUserID, string strRemotePWD, string strLocalName)
        {
            int capacity = 64;
            uint resultFlags = 0;
            uint flags = 0;

            try
            {
                if ((strRemoteConnectString != "" || strRemoteConnectString != string.Empty) &&
                   (strRemoteUserID != "" || strRemoteUserID != string.Empty) &&
                   (strRemotePWD != "" || strRemotePWD != string.Empty))
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder(capacity);
                    NETRESOURCE ns = new NETRESOURCE();
                    ns.dwType = 1;
                    ns.lpLocalName = strLocalName;                 // 로컬 드라이브명(null 이면 자동)
                    ns.lpRemoteName = @strRemoteConnectString;
                    ns.lpProvider = null;

                    int result = WNetUseConnection(IntPtr.Zero, ref ns, strRemotePWD, strRemoteUserID, flags,
                                        sb, ref capacity, out resultFlags);

                    return result;
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                return -1;
            }
        }

        // Net Drive 해제
        [DllImport("mpr.dll", EntryPoint = "WNetCancelConnection2", CharSet = CharSet.Auto)]
        public static extern int WNetCancelConnection2(string lpName, int dwFlags, int fForce);

        // Net Drive 해제
        public int CencelRemoteServer(string strRemoteConnectString)
        {
            int result;

            try
            {
                result = WNetCancelConnection2(strRemoteConnectString, 1, 1);
            }
            catch (Exception ex)
            {
                result = 0;
            }

            return result;
        }
    }
}


"using System.Runtime.InteropServices;" 가 필요하니 등록해 주는거 잊지 말고...

그런 다음 메인 폼의 버튼 클릭 이벤트에 클릭시 저 클래스를 사용하는 소스를 등록해 준다.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NetDrive
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 네트워크 드라이브 연결
            csNetDrive netDrive = new csNetDrive();
            int getReturn = netDrive.setRemoteConnection(@"\\127.0.0.1\data", "son", "password", "Y:");

            if (getReturn == 0)
            {
                MessageBox.Show ("set Net Drive : " + "네트워크 드라이브가 성공적으로 연결되었습니다.");
            }
            else
            {
                MessageBox.Show ("set Net Drive : " + "네트워크 드라이브를 연결할 수 없습니다.\r\n연결 정보를 확인하세요.");
            }
        }
    }
}

현재 드라이브 상태는 이렇다.
아무런 네트워크 드라이브가 연결 되지 않은 상태.


요상태에서 방금 만든 프로그램을 실행 시키고.

저기 버튼을 클릭하면...


요렇게 연결 성공...


드라이브 확인해 보면. 네트워크 드라이브가 "Y:" 드라이브로 연결 된 것을 볼 수 있다.

이 연결된걸 끊을 려면...


일단 버튼 하나 추가해 주고....



private void button2_Click(object sender, EventArgs e)
        {
            // 네트워크 드라이브 연결 해제
            csNetDrive dataDrive = new csNetDrive();
            int getReturn = dataDrive.CencelRemoteServer("Y:");
        }

클릭 이벤트에 연결 해재하는 소스를 등록해 주고, 실행.
"CencelRemoteServer()" 에 끊을 드라이브 명을 지정해야 한다는 것을 잊지 말자.


저기서 "넷드라이브 끊기" 버튼을 클릭하면...


이렇게 넷드라이브가 끊어 진다.



2016년 9월 19일 월요일

C# WinForm : Access 파일에 테이블 생성하기.


C# 으로 Access 파일을 생성하였으니...

C# WinForm : Access 파일 생성

이제 생성한 파일에 테이블을 생성해 보자.



C# WinForm : Access 파일 생성

일반적으로 Access 프로그램에서 파일을 사용 할때는 미리 파일을 생성해서 쓰는게 일반적이지만, 프로그램이 실행될때 디비를 초기화를 한다던가, 디비를 동적으로 생성하여 여러개로 나누어서 관리한다던가 등의 이유로 프로그램에서 직접 Access 파일을 생성하는 경우도 있다.


일단 참조를 하나 추가 해야 한다.


여기서 "Microsoft ADO Ext. **** for DDL and Security" 를 추가해 준다.
2.8 과 6.0 이 있는데 어느걸 참조해줘도 별 상관은 없다.


2015년 7월 6일 월요일

C# Winform: "크로스 스레드" 오류가 났을 때, "CheckForIllegalCrossThreadCalls = false" 로 간단히 해결 할 수 있다.

C# 으로 작업하다보면, "크로스 스레드 오류" 라는 것을 가끔 만날 수 있다.



간단히 말해 공통으로 사용하는 오브젝트에 스레드들이 지멋대로 접근하게끔 프로그래밍이 되어 있다고 하는 오륜데, 예전에는 그냥 허용되어 있다가 나중에 안되게 막힌 경우라 예전 소스들을 참고 할때 참 귀찮다.

이럴땐, 원칙적으로는 delegate 와 invoke 를 사용해야 하겠으나...

별로 중요한 모듈도 아니고, 데이터가 좀 꼬인다고 해서 별 문제가 없는 경우라면, 간단히 해결 할 수 있다.

그냥 "CheckForIllegalCrossThreadCalls = false;" 를 지정해 주면된다.


이렇게 하면 "크로스 스레드 오류" 는 그냥 무시해 버린다.
물론, 그리 좋은 방법은 아니므로, 가능하면 정상적으로 처리하는 편이 좋다.




C# WinFrom: 시리얼 포트 통신하기.

일단 프로젝트를 생성


"SerialTest" 라고 프로젝트를 생성했다.


요렇게 간단히 화면을 디자인.

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.IO.Ports;

namespace SerialTest
{
    public partial class Form1 : Form
    {
        SerialPort sPort;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            btnOpen.Enabled = true;
            btnClose.Enabled = false;

            cboPortName.BeginUpdate();
            foreach (string comport in SerialPort.GetPortNames())
            {
                cboPortName.Items.Add(comport);
            }
            cboPortName.EndUpdate();

            cboPortName.SelectedItem = "COM4";
            txtBaudRate.Text = "9600";

            CheckForIllegalCrossThreadCalls = false;
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
                if (null == sPort)
                {
                    sPort = new SerialPort();
                    sPort.DataReceived += new SerialDataReceivedEventHandler(sPort_DataReceived);

                    sPort.PortName = cboPortName.SelectedItem.ToString();
                    sPort.BaudRate = Convert.ToInt32(txtBaudRate.Text);
                    sPort.DataBits = (int)8;
                    sPort.Parity = Parity.None;
                    sPort.StopBits = StopBits.One;
                    sPort.ReadTimeout = (int)500;
                    sPort.WriteTimeout = (int)500;
                    sPort.Open();
                }

                if (sPort.IsOpen)
                {
                    btnOpen.Enabled = false;
                    btnClose.Enabled = true;

                    MessageBox.Show("시리얼 포트를 연결했습니다.");
                }
                else
                {
                    btnOpen.Enabled = true;
                    btnClose.Enabled = false;
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] byteSendData= new byte[200];
            int iSendCount =0;
            try
            {
                if(true == chkSndHexa.Checked)
                {
                    foreach (string s in txtSend.Text.Split(' '))
                    {
                        if (s != null && s != "")
                        {
                            byteSendData[iSendCount++] = Convert.ToByte(s, 16);
                        }
                    }
                    sPort.Write(byteSendData, 0, iSendCount);
                }
                else
                {
                    sPort.Write(txtSend.Text);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int intRecSize = sPort.BytesToRead;
            string strRecData;

            if (intRecSize != 0)
            {
                strRecData = "";
                byte[] buff = new byte[intRecSize];

                sPort.Read(buff, 0, intRecSize);
                for (int iTemp = 0; iTemp < intRecSize; iTemp++)
                {
                    if (chkRecHexa.Checked)
                        { strRecData += buff[iTemp].ToString("X2") + " "; }
                    else
                        { strRecData += Convert.ToChar(buff[iTemp]); }
                }
                txtRec.Text += strRecData;
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (null != sPort)
            {
                if (sPort.IsOpen)
                {
                    sPort.Close();
                    sPort.Dispose();
                    sPort = null;
                }
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (null != sPort)
            {
                if (sPort.IsOpen)
                {
                    sPort.Close();
                    sPort.Dispose();
                    sPort = null;
                }
            }

            btnOpen.Enabled = true;
            btnClose.Enabled = false;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtRec.Clear();
        }
    }
}


소스는 이렇게 하면 되고...


com0com 을 이용해 COM4와 COM5 를 매칭.
com0com 설치 하는법 참조.


모니터링 할 Putty를 COM5 에다 연결.


테스트 준비 완료.

포트 연결.
보낼 데이터를 기록하고... "Send" 를 클릭하면...
데이터가 싸악~~~
터미널에서 키보드를 두둘기면... 아래 프로그램에 나타남....
"Rec Hexa" 가 체크 되어 있으면 전송된 값을 Hexa 코드로 보여줌.

"Snd Hexa" 가 체크 되어 있으면 Hexa 코드로 전송함.

Good ... -_-)b



2015년 5월 19일 화요일

C# WinForm : JSON 결과값을 반환하는 웹서비스 값 가져오기

.Net 의 웹서비스를 이용해서 JSON 데이터를 보내는 것을 만들어 보았다.
[JSON 웹서비스 만들기 링크: http://son10001.blogspot.kr/2015/05/c-json.html]

그럼 이걸 써먹어야지.
WinForm 에서 한번 불러와 보자.

일단 "Newtonsoft.Json" 를 참조에 넣자.

참조에 "NuGet 패키지 관리..." 에서...


Json.NET 을 설치하면...


이렇게 "Newtonsoft.Json" 이 설치된다.
물론 JSON 데이터를 직접 컨트롤할 자신이 있다면 안해도 되긴 한다.

일단 MIT License 라서 부담이 적으니 뭐... 그냥 쓰자...

그리고, 폼을 대충 하나 생성한다.

버튼을 클릭하면 아래 텍스트 박스에 데이터를 출력할 꺼임.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using System.Net;
using System.IO;

namespace IPlugWorks
{
    public partial class frmWebService : Form
    {
        public frmWebService()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Request_Json();
        }

        private string Request_Json()
        {
            string result = null;
            string url = "http://localhost:915/_Test/testService.asmx/getMemberInfoJson";

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "Application/json;charset=utf-8";

                //전달할 파라메타    
                //string sendData = "param1=1&param2=2";
                string sendData = "";

                byte[] buffer;
                buffer = Encoding.Default.GetBytes(sendData);
                request.ContentLength = buffer.Length;

                Stream sendStream = request.GetRequestStream();
                sendStream.Write(buffer, 0, buffer.Length);
                sendStream.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream respPostStream = response.GetResponseStream();
                StreamReader readerPost = new StreamReader(respPostStream, Encoding.UTF8);

                result = readerPost.ReadToEnd();
                JsonParser(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return result;
        }


        private void JsonParser(String json)
        {
            JObject obj = JObject.Parse(json);
            JArray array = JArray.Parse(obj["d"].ToString());

            foreach (JObject itemObj in array)
            {
                textBox1.Text += " ID : " + itemObj["Id"].ToString();
                textBox1.Text += " --- ";
                textBox1.Text += " Name : " + itemObj["Name"].ToString();
                textBox1.Text += "\r\n";
            }
        }
    }
}


이렇게 하면 되는데...
참고로, 웹서비스를 불러오는데, 웹서비스 참조를 등록하지 않고 바로 웹페이지를 로딩해서 쓰고 있다.

암튼. 이렇게하고 버튼을 눌러 조회 하면...


결과값이...

{\"d\":\"[{\\\"Id\\\":\\\"User01\\\",\\\"Name\\\":\\\"Guest\\\"},{\\\"Id\\\":\\\"Son10001\\\",\\\"Name\\\":\\\"Son\\\"}]\"}

이렇게 나온다.
왜그런지는 잘 모르겠지만, 전체 데이터가 "d" 로 Wrapping 되어서 나온다.
게다가 복잡하게 이스케이프 문자("\")가 썪여 있어서 쓰기 좀 번거롭다.

이때... Newtonsoft.Json 로 Parse 시키면...
 이때 "d" 를 기준으로 파싱... 그러면...


이렇게 정돈된 데이터를 얻을 수 있다.




2015년 3월 31일 화요일

C# WinForm 프로그램의 실행 경로 알아내기

프로그램이 실행될때, 그 프로그램이 어디서 실행되고 있는지 알아 낸다.

1) Application.StartupPath
2) System.Environment.CurrentDirectory
3) System.IO.Directory.GetCurrentDirectory()
4) AppDomain.CurrentDomain.BaseDirectory

이 4가지가 주로 사용되는데, (1)은 WinForm 에서만 사용가능하다.


이것은 WinForm 에서 체크한 값이다.
보다시피 (1)(2)(3) 은 동일한 결과 값을 보여 주며, (4) 는 값 자체는 같지만 끝에 "\" 가 더 붙어 있으니 주의 해야 한다.

2015년 3월 7일 토요일

C# WinForm 새로 추가한 판넬에 기존 컨트롤을 이동 시키기

폼을 디자인 하다보면 판넬이나 프레임을 만들어 그룹을 지어서 관리하는게 편리하다.

문제는 처음에는 간단한 컨트롤을 생각하고 디자인 했다가, 나중에 너무 복잡해 져서 판넬로 그룹을 만들어 관리하고 싶을때 인데...


사실 별로 어렵지 않다.


그냥, 판넬 하나 선택하고, 원하는 컨트롤이 있는 지역을 드래그 해서, 영역을 지정해 주면...


이렇게 선택된 영역이 추가된 판넬에 들어 가게 된다.
만약, 기존에 존재하는 판넬에 컨트롤을 옮겨야 한다면?



마우스로 해당 컨트롤을 선택해 직접 드래그해 넣어도 된다.
하지만, 컨트롤이 많다던가 형태가 복잡해서 하나하나 찍기가 곤란하다던가 하면, 작업할 폼의 "Designer.cs" 파일을 수정하면 된다.


"Designer.cs" 을 보면 이동하고 싶은 컨트롤들이 "this.Controls.Add()" 로 등록되어 있는 것이 보일 것이다.

이것을 원하는 컨트롤에 등록되도록 수정해 준다.


이렇게 "this.Controls" 이엇던 것을 "this.panel1.Controls" 로 바꾸어 준다.
이렇게 하면...


기존의 컨트롤이 없어진것처럼 보이지만...


이것은 해당 컨트롤의 X, Y 좌표가 메인 폼이 아닌 이동한 판넬의 좌표로 적용되었기 때문에 현재 위치가 판넬의 영역밖으로 지정되어 안보이기 때문이다.
그러니, 판넬의 크기를 키워보면, 해당 판넬에 잘 등록되어 있는 것을 볼수 있을 것이다.


이제 부터는 판넬로 해당 컨트롤들을 한꺼번에 관리 할 수 있다.