단일 테이블 연결
SqlDataAdapter myadapter=new SqlDataAdapter("select * from address", 
"server=(local);Trusted_connection=yes;database=ado"); DataSet mydataset=new DataSet(); myadapter.Fill(mydataset, "address"); dataGrid1.DataSource=mydataset.Tables["address"].DefaultView; 행의 추가 SqlDataAdapter myadapter=new SqlDataAdapter("select * from address",
"server=(local);Trusted_connection=yes;database=ado"); SqlCommandBuilder mycommandbuilder=new SqlCommandBuilder(myadapter); DataSet mydataset=new DataSet(); myadapter.Fill(mydataset, "address"); DataRow myrow=mydataset.Tables["address"].NewRow(); myrow["name"]=textBox1.Text; myrow["phone"]=textBox2.Text; myrow["email"]=textBox3.Text; mydataset.Tables["address"].Rows.Add(myrow); myadapter.Update(mydataset, "address"); dataGrid1.DataSource=mydataset.Tables["address"].DefaultView; 행의 삭제 SqlDataAdapter myadapter=new SqlDataAdapter("select * from address",
"server=(local);Trusted_connection=yes;database=ado"); SqlCommandBuilder mycommandbuilder=new SqlCommandBuilder(myadapter); DataSet mydataset=new DataSet(); myadapter.Fill(mydataset, "address"); curRow=dataGrid1.CurrentRowIndex; if (curRow >-1) mydataset.Tables["address"].Rows[curRow].Delete(); myadapter.Update(mydataset.GetChanges(DataRowState.Deleted), "address"); dataGrid1.DataSource=mydataset.Tables["address"].DefaultView; 행의 수정 SqlDataAdapter myadapter=new SqlDataAdapter("select * from address",
"server=(local);Trusted_connection=yes;database=ado"); SqlCommandBuilder mycommandbuilder=new SqlCommandBuilder(myadapter); DataSet mydataset=new DataSet(); myadapter.Fill(mydataset, "address"); curRow=dataGrid1.CurrentRowIndex; mydataset.Tables["address"].Rows[curRow].BeginEdit(); mydataset.Tables["address"].Rows[curRow]["name"]=textBox1.Text; mydataset.Tables["address"].Rows[curRow]["phone"]=textBox2.Text; mydataset.Tables["address"].Rows[curRow]["email"]=textBox3.Text; mydataset.Tables["address"].Rows[curRow].EndEdit(); myadapter.Update(mydataset, "address"); dataGrid1.DataSource=mydataset.Tables["address"].DefaultView;
위를 보시면 대충 연결에 대해 이해가 가실꺼고..
대충 요런식으로 리스트 뷰에 데이타를 집어 넣으시면 되겠네요.ㅎㅎ
public void GetPatientList(ListView list)
  {
   
   list.Items.Clear();
   ListViewItem item;
   foreach(DataRow r in dSet.Tables["patient"].Rows)
   {
    item=new ListViewItem(r["name"].ToString());
    item.SubItems.Add(r["jumin"].ToString());
    item.SubItems.Add(r["id"].ToString());
    list.Items.Add(item);
   }
  }
2007/08/31 10:10 2007/08/31 10:10

C#에서 현재 실행중인 프로그램을 다시 실행하는 경우가 발생할 때 중복실행 여부를

확인하여 그에 대한 처리를 할 수 있도록 하는 코드이다.

System.Threading.Mutex 클래스를 이용한다.

기본적인 사용법은 다음과 같다.

[STAThread]
static void Main() {
    bool createdNew;
    Mutex gM1 = new Mutex(true,"MyMutex", out createdNew);              
    if (createdNew) {
        Application.Run(new frmMain());
        gM1.ReleaseMutex();
    }else {
        MessageBox.Show("이미 실행되어 있습니다.");
    }
}

이를 응용하여 네이트온과 같이 실행중인 경우 트레이에 있을 때 중복 실행이 되면 기존에 실행중인

프로그램을 활성화 시키는 방법이다.

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void BringWindowToTop(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void SetForegroundWindow(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[STAThread]
static void Main() {
    bool createNow = true;
    using(System.Threading.Mutex mutex =
              new System.Threading.Mutex(true, "ServerControllerMutex", out createNow)) {
        if (createNow) {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new FormMain());
        }
        else {
            IntPtr wHandle = FindWindow(null, "PDA 수신 서버");
            if (wHandle != IntPtr.Zero) {
               ShowWindow(wHandle, 1);
               BringWindowToTop(wHandle);
               SetForegroundWindow(wHandle);
            }
            Application.Exit();
        }
    }
}

2007/04/25 23:19 2007/04/25 23:19
응용 프로그램에서 프로그램의 실행 경로는 System.Environment.CurrentDirectory를 이용하여

프로그램이 실행중인 폴더경로를 얻어올 수 있으나. 원도우 서비스인 경우 위의 방법을 이용하면

"C:\Windows\System32" 폴더를 반환한다. 따라서 실행중인 폴더에서 파일을 읽는 경우 못읽는

경우가 발생한다. 이를 위해 다음과 같이 System.Reflection.Assembly 클래스를 이용하여 어셈블리

의 절대경로를 얻어옴으로써 원도우 서비스에서도 실행중인 폴더에서의 파일을 읽을 수 있다.


System.Reflection.Assembly Asm = System.Reflection.Assembly.GetExecutingAssembly();
string location = Asm.Location; // 어셈블리(EZChatServerLib) 절대경로가 반환된다.
location = location.Substring(0, location.LastIndexOf("\\"));

위 코드를 이용하면 어셈블리의 절대경로를 얻어올 수 있다.
2007/04/10 02:32 2007/04/10 02:32

DateTime 형식을 변환 할 수 있는 클래스 소스를 올려 드립니다. 참고 하세요

#region DateFormat 열거형
 /// <summary>
 /// 설  명 : DataFormat 열거형
 /// 작성일 : 2005-03-02
 /// </summary>
public enum DateFormat {
    TT_DATE,  // yyyyMMddHHmm
    TT_DAY,   // yyyyMMdd
    TT_TIME   // HHmmss
}
#endregion

#region 날짜 형식 관련 변환 Method
/// <summary>
/// 설  명 : string(yyyyMMdd) -> DateTime 으로 변경
/// 작성일 : 2005-03-02
/// </summary>
/// <param name="a_sDay">변환할 날짜 String</param>
/// <returns>DateTime 날짜</returns>
public static DateTime GetDTDay(string a_sDay) {
    DateTime dtDate =
        DateTime.ParseExact(a_sDay, "yyyyMMdd",
                                       System.Globalization.DateTimeFormatInfo.InvariantInfo ,
                                       System.Globalization.DateTimeStyles.None);
        return dtDate;
}

/// <summary>
/// 설  명 : string(yyyyMMdd) -> string(yy/MM/dd)으로 변경
/// 작성일 : 2005-03-02
/// </summary>
/// <param name="a_sDay">변환할 날짜 String</param>
/// <returns>DateTime 날짜</returns>
public static string GetDTDay2(string a_sDay) {
    DateTime dtDate = DateTime.ParseExact(a_sDay,
                             "yyyyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo ,
                             System.Globalization.DateTimeStyles.None);
    return dtDate.ToString("yy/MM/dd").Replace("-","/");
}

/// <summary>
/// 설  명 : string(yyyyMMdd) -> string(yyyy/MM/dd)으로 변경
/// 작성일 : 2005-03-02
/// </summary>
/// <param name="a_sDay">변환할 날짜 String</param>
/// <returns>DateTime 날짜</returns>
public static string GetDTDay3(string a_sDay) {
    DateTime dtDate = DateTime.ParseExact(a_sDay,
                           "yyyyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo ,
                           System.Globalization.DateTimeStyles.None);
    return dtDate.ToString("yyyy/MM/dd").Replace("-","/");
}

/// <summary>
/// 설  명 : string(yyyyMMddHHmm) -> DateTime 으로 변경<br/>
/// </summary>
/// <param name="a_sDate">변환할 날짜 String</param>
/// <returns>DateTime 날짜</returns>
public static DateTime GetDTDate(string a_sDate) {
    DateTime dtDate = DateTime.ParseExact(a_sDate,
                                                   "yyyyMMddHHmm",
                                                   System.Globalization.DateTimeFormatInfo.InvariantInfo ,
                                                   System.Globalization.DateTimeStyles.None);
    return dtDate;
}

/// <summary>
/// 설  명 : DateTime -> string(yyyyMMdd)으로 변경<br/>
/// </summary>
/// <param name="a_odtDateTime">변환할 날짜 DateTime</param>
/// <returns>string 날짜</returns>
public static string GetStrDay(DateTime a_odtDateTime) {
    return GetStrDate(a_odtDateTime, DateFormat.TT_DAY);
}
/// <summary>
/// 설  명 : DateTime -> string(HHmm)으로 변경<br/>
/// </summary>
/// <param name="a_odtDateTime">변환할 날짜 DateTime</param>
/// <returns>string 시간</returns>
public static string GetStrTime(DateTime a_odtDateTime) {
    return GetStrDate(a_odtDateTime, DateFormat.TT_TIME);
}

        /// <summary>

        /// 설  명 : DateTime -> string(yyyyMMddHHmm)으로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string (yyyyMMddHHmmss)</returns>

        public static string GetStrDate(DateTime a_odtDateTime)

        {

            return GetStrDate(a_odtDateTime, DateFormat.TT_DATE);

        }


        /// <summary>

        /// 설  명 : DateTime -> string(yyyy)으로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string 날짜</returns>

        public static string GetStrYear(DateTime a_odtDateTime)

        {

            return a_odtDateTime.Year.ToString().PadLeft(4 , '0');

        }


        /// <summary>

        /// 설  명 : DateTime -> string(MM)으로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string 날짜</returns>

        public static string GetStrMonth(DateTime a_odtDateTime)

        {

            return a_odtDateTime.Month.ToString().PadLeft(2 , '0');

        }


        /// <summary>

        /// 설  명 : DateTime -> string(dd)으로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string 날짜</returns>

        public static string GetStrDay2(DateTime a_odtDateTime)

        {

            return a_odtDateTime.Day.ToString().PadLeft(2 , '0');

        }


        /// <summary>

        /// 설  명 : DateTime -> 요일로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string 날짜</returns>

        public static string GetStrDayOfWeek(DateTime a_odtDateTime)

        {

            switch(a_odtDateTime.DayOfWeek)

            {

                case DayOfWeek.Monday:

                    return "월";


                case DayOfWeek.Tuesday:

                    return "화";


                case DayOfWeek.Wednesday:

                    return "수";

               

                case DayOfWeek.Thursday:

                    return "목";

               

                case DayOfWeek.Friday:

                    return "금";

               

                case DayOfWeek.Saturday:

                    return "토";

               

                case DayOfWeek.Sunday:

                    return "일";

            }

            return "";

        }


        /// <summary>

        /// 설  명 : DateTime -> 오전/오후 로 변경<br/>

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <returns>string 날짜</returns>

        public static string GetStrAmPm(DateTime a_odtDateTime , string strLang)

        {

            try

            {

                if(a_odtDateTime.Hour > 12)

                {

                    if(strLang.Equals("K"))

                        return "(오후) ";

                    else

                        return "(PM) ";

                }

                else

                {

                    if(strLang.Equals("K"))

                        return "(오전) ";

                    else

                        return "(AM) ";

                }

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }


        /// <summary>

        /// DateTime -> string 내부 함수

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <param name="a_tDateFormat">DataFormat</param>

        /// <returns></returns>

        public static string GetStrDate(DateTime a_odtDateTime, DateFormat a_tDateFormat)

        {

            string sEditDate = null;

            DateTime dtDateTime;

            if(a_odtDateTime.Equals(DateTime.MinValue))

            {

                dtDateTime = DateTime.Now;

            }

            else

            {

                dtDateTime = a_odtDateTime;

            }


            string sDay = dtDateTime.ToString("yyyyMMdd");

            string sTime = dtDateTime.ToString("HHmm");

           

            switch(a_tDateFormat)

            {

                case DateFormat.TT_DATE:

                    sEditDate = sDay + sTime;

                    break;

                case DateFormat.TT_DAY:

                    sEditDate = sDay;

                    break;              

                case DateFormat.TT_TIME:

                    sEditDate = sTime;

                    break;

            }


            return sEditDate;

        }


        /// <summary>

        /// DateTime -> string 내부 함수

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <param name="a_tDateFormat">사용자가 정의한 변환 형식</param>

        /// <returns></returns>

        public static string GetStrFormatDate(DateTime a_odtDateTime, string a_tDateFormat)

        {

           

            DateTime dtDateTime;

            try

            {

                if(a_odtDateTime.Equals(DateTime.MinValue))

                {

                    dtDateTime = DateTime.Now;

                }

                else

                {

                    dtDateTime = a_odtDateTime;

                }

                return a_odtDateTime.ToString(a_tDateFormat).Replace("-","/");

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }



        /// <summary>

        /// 설  명 : 여러가지 날짜 형식 String을 String 형식에 맞는 날짜 포맷으로 -> DateTime 으로 변경<br/>

        /// </summary>

        /// <param name="a_sDate">변환할 날짜 String</param>

        /// <param name="a_sDate">변환할 날짜 String 에 맞는 날짜 포맷</param>

        /// <returns>DateTime 날짜</returns>

        public static DateTime GetDateTimeFormatString(string a_sDate, string a_sFormat)

        {

            try

            {

                DateTime dtDate = DateTime.ParseExact(a_sDate, a_sFormat,System.Globalization.DateTimeFormatInfo.InvariantInfo ,System.Globalization.DateTimeStyles.None);

                return dtDate;

            }

            catch(Exception ex)

            {

                throw ex;

            }


        }

       

        /// <summary>

        /// DateTime -> string 내부 함수

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <param name="a_sFormatString">사용자가 정의한 변환 형식</param>

        /// <returns>ex) 2005년 4월 8일 금요일 22:21</returns>

        public static string GetStrFullFormatDate(string a_sDate, string a_sFormatString)

        {

            DateTime dtDateTime;

            try

            {

                // 사용자가 정의한 형식으로 DataTime 형식 날짜 생성

                dtDateTime = GetDateTimeFormatString(a_sDate, a_sFormatString);

           

                //  리턴할 문자열 생성

                return GetStrFormatDate(dtDateTime, "yyyy/MM/dd ") + GetStrDayOfWeek(dtDateTime) + GetStrAmPm(dtDateTime, "E") +  GetStrFormatDate(dtDateTime, "HH:mm");

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }

        /// <summary>

        /// DateTime -> string 내부 함수

        /// </summary>

        /// <param name="a_odtDateTime">변환할 날짜 DateTime</param>

        /// <param name="a_sFormatString">사용자가 정의한 변환 형식</param>

        /// <returns>ex) 2005년 4월 8일 금요일 22:21</returns>

        public static string GetStrFullFormatDate2(DateTime a_odtDateTime)

        {

            try

            {   

                //  리턴할 문자열 생성

                return GetStrFormatDate(a_odtDateTime, "yyyy/MM/dd ") + GetStrDayOfWeek(a_odtDateTime) + GetStrAmPm(a_odtDateTime, "E") +  GetStrFormatDate(a_odtDateTime, "HH:mm");

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }


        /// <summary>

        /// 설  명 : 20050314--> 2005-03-14 형식으로 변환

        /// </summary>

        /// <param name="strDate">변환할 날짜</param>

        /// <returns></returns>

        public static string getDateTimeFormat(string strDate)

        {

            string strReturn = string.Empty;


            try

            {

                // 변환하려는 날짜가 8자리 이상이어야 함.

                if (strDate.Length > 7)

                {

                    strDate = strDate.Replace("-","");

                    strReturn = strDate.Substring(0,4) + "-" + strDate.Substring(4,2) + "-" + strDate.Substring(6,2);

                }


                return strReturn;

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }


        /// <summary>

        /// string(yyyyMMdd) 을 ==> string(05/06/17 수요일)

        /// </summary>

        /// <param name="strDate">string(yyyyMMdd)</param>

        /// <returns></returns>

        public static string GetQTDate(string strDate)

        {

            switch(strDate.Length)

            {

                case 8:

                    return GetDTDay(strDate).ToString("yyyy년 MM월 dd일 ") + GetStrDayOfWeek(GetDTDay(strDate)) + "요일";

                case 12:

                    return GetDTDate(strDate).ToString("yyyy년 MM월 dd일 ") + GetStrDayOfWeek(GetDTDate(strDate)) + "요일";

                default:

                    return string.Empty;

            }


        }


        /// <summary>

        /// string(yyyyMMdd) 을 ==> string(yyyy년 MM월 dd일)

        /// </summary>

        /// <param name="strDate">string(yyyyMMdd)</param>

        /// <returns></returns>

        public static string GetNoticeDate(string strDate)

        {

            return GetDTDay(strDate).ToString("yyyy년 MM월 dd일");

        }

        #endregion



     

2007/04/05 21:06 2007/04/05 21:06

C#에서 외부 프로그램을 실행시키기 위해서 System.Diagnostics.Process 클래스가 필요하다.


Process 객체를 생성하고 실행할 파일명과 인자 등을 설정해준다.


System.Diagnostics.Process ps = new System.Diagnostics.Process();
ps.StartInfo.FileName = "실행할 파일명";
ps.StartInfo.WorkingDirectory = "작업 폴더";
ps.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;


위와 같이 실행에 필요한 각종 설정을 해준 후 다음과 같이 외부 프로그램을 실행한다.

ps.Start();


이렇게 실행된 프로그램을 종료하기 위해서는

ps.CloseMainWindow();

로 종료하며 이렇게 해서도 종료가 되지 않으면

ps.Kill();

로 종료한다.

2006/11/17 01:07 2006/11/17 01:07
TAG

PDA에서 무선랜 감도를 얻기 위해서는 기존 EVC++에서는 하드웨어 컨트롤에 대하여

직접적인 처리를 통해 얻을 수 있었지만 C#에서는 하드웨어 컨트롤에 대한 제약이 많고

된다 하더라도 기존의 라이브러리를 이용해야 한다.

하지만 OpenNETCF 라이브러리를 이용하여 처리가 가능하다.

우선 OpenNETCF 라이브러리를 설치하고

다음의 네임스페이스를 추가한다.

using OpenNETCF.Net;
using System.Reflection;

우선은 감도를 체크하기 위해서는 설치된 네트워크 어뎁터 중 무선랜 어뎁터를 찾아야 한다.
그러기 위해서 다음과 같은 객체를 생성한다.

OpenNETCF.Net.AdapterCollection myAdapters =
                                                          OpenNETCF.Net.Networking.GetAdapters();

이 객체는 설치된 네트워크 어뎁터의 목록을 가지고 있게 된다.

이중 무선랜 어뎁터를 찾기 위해서는 다음과 같이 하면 된다.

OpenNETCF.Net.Adapter myAdapter = null;

for (int i = 0; i < myAdapters.Count; i++) {
  if (myAdapters[i].IsWireless) myAdapter = myAdapters[i];
}

우선 어뎁터 객체를 저장할 OpenNETCF.Net.Adapter 객체를 생성하고 어뎁터 목록객체의

IsWireless 메소드를 이용하여 무선랜 어뎁터인지를 확인할 수 있다.

무선랜 어뎁터를 확인하여 어뎁터 객체를 얻은 후 무선랜 어뎁터가 AP에 접속되어 있는지

확인하고 AP에 연결되어 있으면 AP에 대한 수신감도를 알 수 있다.

if (myAdapter.AssociatedAccessPoint != "") {
  String strengthString = ((myAdapter.SignalStrength).Strength).ToString();
   MessageBox(strengthString, "무선랜 감도");
}
else {
  MessageBox("AP에 연결되어 있지 않음", "알림");
}

수신 감도는 VeryLow, Low, Good, VeryGood 등의 String으로 나타난다.

첨부파일은 무선랜 감도를 출력해주는 간단한 프로그램이다. CF.NET 2.0으로 되어 있으며

OpenNETCF 라이브러리가 있어야 한다.


2006/10/27 09:50 2006/10/27 09:50

우선 아래의 네임스페이스를 추가한다.
using System.Reflection;
using System.IO;

아래와 같이 해 주면 프로그램이 시작되는 폴더를 받아올수 있습니다.
string fullAppName = Assembly.GetExecutingAssembly().GetName().CodeBase;
string fullAppPath = Path.GetDirectoryName(fullAppName);

즉 현재 실행중인 프로그램의 전체 경로를 구하고
그 값에서 폴더정보를 얻는다.

2006/10/19 15:46 2006/10/19 15:46

개발장비: BIP-5000  WINCE 5.0
개발툴:  VS.NET 2005 C#

WINCE에서는 Connection Manager를 사용하지 못합니다.  
cellcore.dll  파일이 WINCE 이미지에 없습니다.
WINCE에서 CDMA 연동 하기 위해서는 RAS 를 사용하셔야 합니다.
RAS를 사용하기 위해  rasapi32.dll 를 찾으시는 분이 있는데,
WINCE에는 coredll.dll  해당 api 가 포함되어 있습니다.
인터넷 써핑중 초간단 소스가 있어서 올려드립니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

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

      private IntPtr RasConn = IntPtr.Zero;        
       private void button1_Click(object sender, EventArgs e) {
           try {
               IntPtr tmpRasConn;
               Cursor.Current = Cursors.WaitCursor;

               // 설정은 PDA마다 틀릴 수 있습니다.
               // EntryName: 인터넷연결
               // 사용자: sktelecom
               //  PWD : SKT 없음
               uint nErr = myRasDial("인터넷연결", "sktelecom", "", out tmpRasConn);
               if (nErr == 0) RasConn = tmpRasConn;

               // 테스트
               MessageBox.Show(string.Format("{0}:{1}", nErr, tmpRasConn));
           }
           catch (Exception er) {
               MessageBox.Show(er.Message);
           }
           finally {
               Cursor.Current = Cursors.Default;
           }
       }

       private void button2_Click(object sender, EventArgs e) {
           if (RasConn == IntPtr.Zero) return;
           Cursor.Current = Cursors.WaitCursor;
           uint nErr = RasHangUp(RasConn);
           RasConn = IntPtr.Zero;
           MessageBox.Show(nErr.ToString());
           Cursor.Current = Cursors.Default;
       }

       // WINCE 5.0, VS.NET 2005 C# =============================================
       // 출처: http://www.codecomments.com/archive425-2006-2-797845.html
       // Connecting to GPRS programmatically in C# (RAS,RasDial)
       // Author: Aleks S.   2006-02-08, 10:28 am
       // 주의사항: 빌드옵션에서 '안전하지 않은 코드 허용' 체크 하세요.!!
       //========================================================================
       unsafe public static uint myRasDial(string EntryName, string UserName,
           string Password, out IntPtr RasConn) {
           uint r = 0;
           RasConn = IntPtr.Zero;
           byte[] bRASDIALPARAMS = new byte[1464];
           fixed (byte* pAddr = bRASDIALPARAMS) {
               byte* pCurrent = pAddr;
               Marshal.WriteInt32((IntPtr)pCurrent, bRASDIALPARAMS.Length);
               pCurrent += 4;
               foreach (byte b in Encoding.Unicode.GetBytes(EntryName)) {
                   Marshal.WriteByte((IntPtr)pCurrent, b);
                   pCurrent++;
               }

               pCurrent = pAddr + 0x192;//0x192 - offset for RASDIALPARAMS.UserName
               foreach (byte b in Encoding.Unicode.GetBytes(UserName)) {
                   Marshal.WriteByte((IntPtr)pCurrent, b);
                   pCurrent++;
               }


               pCurrent = pAddr + 0x394;//0x394 - offset for RASDIALPARAMS.Password
               foreach (byte b in Encoding.Unicode.GetBytes(Password)) {
                   Marshal.WriteByte((IntPtr)pCurrent, b);
                   pCurrent++;
               }

               r = RasDial(IntPtr.Zero, IntPtr.Zero, (IntPtr)pAddr, 0, IntPtr.Zero, ref RasConn);
           }
           return r;
       }

       [DllImport("coredll.dll")]
       public static extern uint RasDial(IntPtr dialExtensions, IntPtr phoneBookPath,
           IntPtr rasDialParam, uint NotifierType,IntPtr notifier, ref IntPtr pRasConn);

       [DllImport("coredll.dll")]
       public static extern uint RasHangUp(IntPtr pRasConn);        
   }
}

2006/09/18 17:22 2006/09/18 17:22
TAG , ,

1 번의 경우--------------------------------------------------------------------------

   FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
   byte[] send = new byte[fs.Length];
  fs.Read(send,0,(int)fs.Length);
   fs.Close();
   return send;

2번의 경우---------------------------------------------------------------------------

    System.Drawing.Image img = new Bitmap(file);
    // 혹은 Bitmap img = new Bitmap(file);
    MemoryStream ms = new MemoryStream();
    img.Save(ms, img.RawFormat);    
    // 혹은 img.Save(ms, ImageFormat.JPEG);
    byte[] send = new byte[ms.Length];

    ms.Read(send,0,(int)ms.Length);
    ms.Close();
    img.Dispose();

    return send;

위와 같이 1번의 경우와 2번의 경우 send의 값(바이트로 변환된 값)이 틀립니다...
그래서 받은 바이트로 Response.BinaryWrite 해서 표현하면 (웹페이지에서) 1번의 경우는 제대로 이미지를 표현하는 반면 2의 경우는 이미지가 표시 되지 않습니다.

지금 제가 하려고 하는것은 이미지를 읽어서 수정변환작업을 한후 그 이미지를 웹페이지에 보여주려고 합니다. 파일을 저장하지는 않을 거고요...

img.Save(ms, img.RawFormat);  부분에서 ms(메모리스트림) 대신 로컬에 파일명(예: C:\a.jpg) 해서 파일로 저장하면 파일은 잘 저장이 됩니다. 디버깅을 해보면 2번의 ms(메모리스트림과) 1번의 fs(파일스트림) 길이가 틀리더군요

혹시 왜그런지 아시분 계시면 답변좀 부탁드릴께요..

그럼 좋은 하루 되세요...

MemoryStream.Position=0 추가하세요.
올리신 코드를 실행해봤더니 BMP 파일 헤더를 포함한 앞부분 바이트 데이터가 날아가더군요.
그런데도 이미지 파일 크기는 그대로라서 Position 을 초기화시켰더니 제대로 저장이 되네요:D

Image.Save 하신 뒤에서 MemoryStream에서 바이트를 읽기 전에 Position을 0으로 초기화해보세요.


참고로 메모리 스트림에 저장한 파일 크기가 다른 것은 별로 상관없는 듯 합니다.
제 경우엔 포토샵에서 저장한 BMP 파일로 실험해봤는데, 2바이트 차이가 나더군요.
저장해서 바이트 데이터를 보니 맨 마지막 2바이트였는데, 둘다 널이었습니다.

아마 이미지 저장하는 프로그램에서 덧붙인 데이터거나,
윈도에서 이미지 표시하는데 필수적인 데이터는 아니거나, 그런 것 같네요.
BMP 파일 구조는 정확히 몰라서:D

2006/09/07 20:50 2006/09/07 20:50
TAG ,