Custom URI 를 만들어 웹페이지에서 내 PC에 있는 exe 파일을 실행시키는 방법입니다.

아래와 같이 작동 됩니다.

 

웹페이지에서 아이디 비밀번호와 같은 입력 값을 넘겨주며 .exe 파일을 실행시킵니다.
실행 버튼을 누른 결과가 출력됩니다.

 (주의 사항이 하나 있는데 위와 같이 변환 된 결과를 보면 웹 url에서 특수 문자가 다르게 취급됩니다.

UTF-8 과 System.Net.WebUtilty.UrlDecode 기능을 잘 섞어서 필요한 내용으로 만들어주면 되겠습니다.)

 

 

 먼저 레지스트리에 해당 파일을 실행할 수 있도록 등록해주어야 합니다.

 exe파일 실행 시 Main(string[] args) 부분에 대한 처리가 필요합니다.

 차근차근 해봅시다.

 

  1. 윈도우키 + R을 눌러 "실행" 창을 띄워줍니다. (혹은 시작->실행 검색)

  2. regedit 입력을 해줍니다.

실행 창에서 regedit 입력 후 확인

  3. HKEY_CLASSES_ROOT 오른쪽 클릭 후 새로 만들기 -> 키 를 선택해줍니다.

   이름은 "Test"로 설정해주겠습니다.

  4. 아래와 같이 키를 생성해줍니다.

    Test에서 shell, shell 에서 open, open 에서 command까지 생성해줍니다.

  5. Test 에서 새로 만들기 -> 문자열 값 을 통해 새 값을 만들어줍니다.

   해당 값의 이름을 URL Protocol 로 바꿔줍니다.

  6. 이번엔 command 쪽의 기본 값을 수정해줍니다. (기본 값을 더블 클릭 해줍니다.)

  아래와 같이 문자열 편집이 뜹니다. exe파일의 경로가 되겠습니다.

  "C:\Test\test.exe" "%1"

 C드라이브 테스트 폴더의 test.exe 실행을 하고, %1은 실행 시 매개변수 값을 하나 줄 수 있다는 의미입니다.

  7. 비주얼 스튜디오에서 다음과 같은 코드를 작성하고 exe 파일을 생성합니다.

using System;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("받아 온 값");

            if (args.Length > 0)
            {
                Console.WriteLine(args[0]); //받아온 값을 보여줍니다.
            }

            Console.ReadLine(); //값을 보기 위해 대기
        }
    }
}

 

  8. 해당 파일을 C:\Test\Test.exe 로 옮겨줍시다.

  9. 웹에서 실행합니다. 간단하게 url 창에서 실행해보겠습니다.

  test://hihi ook

  원하는 값을 입력해줍니다. 그리고 엔터를 치면

  10. 짜잔 실행이 됩니다.

    저 띄어쓰기 부분은 %20 으로 나오고 맨 마지막에도 / 가 자동으로 붙게 됩니다.

   우선 간단하게 값을 받아오고 실행에 성공을 하였습니다. 

받아온 값을 원하는 값으로 변경해서 사용해주면 됩니다!

 

 설명이 너무 길어져서 나머지는 예제 파일로 남겨두겠습니다.

비주일 스튜디오 2019로 작업한 파일과 레지스트리 생성, test.exe 파일이 들어있습니다.

웹에서 어떻게 호출하는지와 C#에서 값을 어떻게 받아오는지도 있으니 필요하면 확인해보시길!

커스텀 URI 만들기.zip
0.83MB

 

코드 정리도 따로 올립니다.

html 코드

 

[파일명]

custom uri.html

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <script>
   
   function play ()
   {
    let id = document.getElementById("ID").value;
    let pw = document.getElementById("PW").value;

    let url = "Test://" + id + "&" + pw + "&"; // 레지스트리에 등록 된 Test:// 호출 부분입니다.
    //마지막에 &를 추가해줬는데 끝 부분에 / 와 같은 문자가 붙을 수 있어 경계 탐지용으로..
    let exec = document.createElement("a");
    exec.setAttribute("href", url);
    exec.click();
   }   

  </script>
 </head>
 <body>
  <div> 아이디 <input id="ID" type="text" value="testID!@"></div>
  <div> 비밀번호 <input id="PW" type="text" value="!@#$%^&*()"></div>
  <div> <button id="call" onclick="play()"> 실행 </button> </div>
 </body>
</html>

 

WindowsForm

[Program.cs]

using System;
using System.Windows.Forms;

namespace Custom_uri_Example
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
         
            if (args.Length > 0) //외부 호출하여 인자값이 있는 경우
            {
                Application.Run(new Form1(args));
            }
            else //바로 .exe 실행
            {
                Application.Run(new Form1());
            }
        }
    }
}

 

[Form1.cs]

using System.Windows.Forms;

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

        public Form1(string[] args) : this()
        {
            textBox_all.Text = args[0];

            string data = args[0].Replace("test://", ""); //앞에 불필요한 문자열은 지워줍니다.

            string[] separate = data.Split('&'); //사전에 약속 된 구분자로 나눠줍니다.

            string utf_id = separate[0];
            string utf_pw = separate[1];

            textBox_utf_id.Text = utf_id;
            textBox_utf_pw.Text = utf_pw;

            //웹에서 받아온 문자 중 특수문자가 다른 경우가 있을 때 WebUtility를 사용해줍니다.
            //System.Net 사용이 안되면 참조 추가에서 System.Net을 추가해주면 됩니다.
            string web_id = System.Net.WebUtility.UrlDecode(separate[0]);
            string web_pw = System.Net.WebUtility.UrlDecode(separate[1]);

            textBox_web_id.Text = web_id;
            textBox_web_pw.Text = web_pw;
        }
    }
}

+ Recent posts