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 System.Runtime.InteropServices;


class Program
{
public static void Main(string[] args)
{
ContinueNoLoginCls nm = new ContinueNoLoginCls();
nm.running();
}
}

class ContinueNoLoginCls
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("User32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll")]
public static extern IntPtr FindWindowEx(int hWnd1, int hWnd2, string lpClassName, string lpWindowName);

const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
const uint WM_CHAR = 0x0102;
const int VK_TAB = 0x09;
const int VK_ENTER = 0x0D;
const int VK_UP = 0x26;
const int VK_DOWN = 0x28;
const int VK_RIGHT = 0x27;
const int VK_F5 = 0x74;
const int VK_F6 = 0x75;
 
//According to SPY++ in IE

//ENTER key is
// P KEYDOWN
// P CHAR
// S CHAR
// P KEY_UP

//TAB key is
// P KEYDOWN
// P KEYUP

//DOWN, UP, RIGHT, LEFT is
// P KEYDOWN
// S KEYDOWN
// P KEYUP

//Letters is
// P KEYDOWN
// S KEYDOWN
// P CHAR
// S CHAR
// P KEYUP

IntPtr tailHandle = IntPtr.Zero;
IntPtr Handle_1 = IntPtr.Zero;
IntPtr Handle_2 = IntPtr.Zero;
//const string captionmsg="파일 탐색기";
//const string captionmsg="명령 프롬프트";
const string captionmsg="네이버 부동산 - Microsoft Edge";

public void running()
{
Console.Title = "";
tailHandle = FindWindow(null, captionmsg);

ConsoleKeyInfo keyinfo;

while(true)
{
keyinfo=Console.ReadKey(true);

debug(">>>>KEY:[" + keyinfo.Key.ToString() + "]");

if(keyinfo.Key==ConsoleKey.Enter)
{
debug(">>>>SendTab() method call!!");
SendTab();
}
else if(keyinfo.Key==ConsoleKey.RightArrow)
{
debug(">>>>SendArrowKey() method call!!");
SendChar(VK_F5);
}
else if(keyinfo.Key==ConsoleKey.Spacebar)
{
debug(">>>>SendArrowKey() method call!!");
SendArrowKey(VK_F5);
}

else if(keyinfo.Key==ConsoleKey.Escape)
{
debug(">>>>Quit() method call!!");
break;
}
}
}

void debug(string str)
{
Console.WriteLine(str);
}

    private void SendEnter()
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(tailHandle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        SendMessage(tailHandle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);
    }

    private void SendTab()
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)VK_TAB, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)VK_TAB, IntPtr.Zero);
    }

    private void SendArrowKey(int key)
    {
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        SendMessage(tailHandle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)key, IntPtr.Zero);
    }

    private void SendChar(int key)
    {
        //Keydown wParam values are 0x020 less than WM_CHAR wParam
        PostMessage(tailHandle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        SendMessage(tailHandle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        PostMessage(tailHandle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        SendMessage(tailHandle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        PostMessage(tailHandle, WM_KEYUP, (IntPtr)(key - 0x020), IntPtr.Zero);
    }
}



Assembly.LoadFrom() : DLL 활용하여, Form을 띄우기
/*----------------------------------------------------------------------
Description : 클래스라이브러리로 생성되어진 폼을 띄울때에 사용되어진다.(폼형태만 가지고 인는것을 폼처럼 만들어서 띄울수있다.)
ex) 
1. frm's name : UAPDBMQ0010
2. dll's name : DBM.DLL
----------------------------------------------------------------------*/

sample code>>

string formName = "UAPDBMQ0010";
string dllName = formName.Substring(3,3); //DBM.DLL
string assembly = dllName + ".DLL";
string classname = dllName + "." + formName;

Assembly asm = Assembly.LoadFrom(assembly);
object o = asm.CreateInstance(classname);
var doc = (Form)o;

Form frm = doc;
frm.Tag = assembly;
if(frm == null) return null;

frm.MdiParent = this; //MDI CASE
frm.FormBorderStyle = FormBorderStyle.None; //NEW FORM
frm.Dock = DockStyle.Fill //POPUP, WHEN DELETE

frm.Text="";
frm.TopLevel=false;
frm.Parent=this;
frm.Show();

[C#] PDB(*.pdb) 파일(?)

PDB 파일이란 무엇이며 솔루션을 다시 빌드 할 때 릴리스 폴더에서 PDB 파일을 어떻게 제외시킬 수 있습니까?

PDB 파일에는 디버거가 작업 할 정보가 들어 있습니다. 
릴리스 빌드에는 디버그 빌드보다 정보가 적습니다. 
그러나 전혀 생성하지 않으려면 프로젝트의 빌드 속성으로 이동하여 릴리스 구성을 선택하고 “고급 …”을 클릭 한 다음 
"디버그 정보"에서 "없음"을 선택하십시오.

오늘까지는 Exception.StackTrace예외를 해결하는 데 필요한 파일 및 줄 번호 정보가없는 메시지 상자에 왜 누락 되었는지 알아 내려고 시도 할 때까지 모든 것이 제대로 작동했습니다 . 
이 게시물을 다시 읽고 중요한 정보를 발견했습니다 
.PDB는 앱을 실행하는 데 필요하지 않지만 파일과 줄 번호가 StackTrace문자열 에 있어야 합니다. 
PDB 파일을 실행 가능 폴더에 포함 시켰으며 이제는 모두 정상입니다.

PDB 는 P rogram D ata B ase 의 약자입니다. 
이름에서 알 수 있듯이 프로그램을 디버그 모드로 실행하는 데 필요한 정보를 유지 관리하는 저장소 (데이터베이스와 같은 영구 저장소)입니다. 
여기에는 코드를 디버깅하는 동안 (Visual Studio에서) 디버거가 Visual Studio에서 중단 될 것으로 예상되는 지점을 삽입 한 지점과 같은 중요한 관련 정보가 많이 포함되어 있습니다.

*.pdb디버그 폴더에서 파일 을 제거하면 Visual Studio가 중단 점에 여러 번 실패하는 이유 입니다. Visual Studio 디버거는 파일을 사용하여 스택 추적에서 예외가 발생한 정확한 줄 번호의 코드 파일을 알려줄 수도 *.pdb있습니다. 따라서 효과적으로 pdb 파일은 프로그램을 디버깅하는 동안 개발자에게 큰 도움이됩니다.

일반적으로 *.pdb파일 생성을 제외하지 않는 것이 좋습니다 . 
프로덕션 릴리스 관점에서해야 할 일은 pdb 파일을 작성하지만 제품 설치 프로그램의 고객 사이트에는 제공하지 않는 것입니다. 
생성 된 모든 PDB 파일을 필요한 경우 나중에 사용 / 참조 할 수있는 기호 서버에 보존하십시오. 
특히 프로세스 충돌과 같은 문제를 디버깅하는 경우에 적합합니다. 
크래시 덤프 파일 분석을 시작하고 *.pdb빌드 프로세스 중에 만들어진 원본 파일이 유지되지 않으면 Visual Studio에서 크래시를 일으키는 정확한 코드 줄을 만들 수 없습니다 .

PDB 파일은 디버거에 의해 사용되는 정보가 포함되어 있습니다. 
응용 프로그램을 실행할 필요가 없으며 릴리스 된 버전에 포함시킬 필요가 없습니다.

Visual Studio에서 pdb 파일이 생성되지 않도록 설정할 수 있습니다. 
명령 행 또는 스크립트에서 빌드하는 경우 /Debug스위치 를 생략하십시오.


C#프로젝트를 빌드하면, exe 혹은 dll파일과 함께 pdb파일도 함께 나오는 것을 종종 확인하셨을 것입니다.
pdb파일은 프로그램을 디버깅할 때 필요한 파일입니다.
pdb파일 속에는 디버깅에 필요한 정보들이 포함되어 있습니다.
이 말을 뒤집으면 프로그램을 배포할 때에는 pdb파일이 있어선 안 되겠죠.
그래서 혹시 배포 패키지에 pdb파일이 섞여 들어가는 것을 막기 위해 빌드 옵션을 설정할 수가 있습니다.
그럼 지금부터 pdb파일을 나오게 하는 법, 안 나오게 하는법에 대해 알아보도록 하겠습니다.

>>>>PDB파일 안나오게 하는 법

1. 프로젝트 우클릭 2. Properties 클릭 3. 좌측의 Build 클릭 4. Advanced 클릭 5. Debugging information을 Pdb-only로 설정

 


//APM/APMCommManager/APMCommManagerForm.cs
void recvWorker_DoWork(object sender, DoWorkEventArgs e)
{
    byte[][] jsonByte = null;

    jsonByte=____receiveRedis.BLPop("CLI:" + ClientCurrentId.GetInstance.MyId, 10);
    for(ii=1; ii<jsonByte.Length; ii++)
    {
        byte[] ____jsonByte=new byte[jsonByte[ii].Length];
        jsonByte[ii].CopyTo(____jsonByte, 0);

        recvQueue.Enqueue(____jsonByte);// 데이타를 입력한다.

        SendToTail()// 수신받은 데이타를 로그로 기록한다.

        if( ! ____sendClientWorker.IsBusy) ____sendClientWorker.RunWorkerAsync();
    }
}

//APM/APMCommManager/APMCommManagerForm.cs
void ____sendClientWorker_DoWork(object sender, DoWorkEventArgs e)
{
    if(receiveQueue > 0)
    {
        byte[] buffer = receiveQueue.Dequeue(); //데이타를 꺼낸다.
        CheckData(buffer);
    }
}

//APM/APMCommManager/APMCommManagerForm.cs
void CheckData(byte[] buffer)
{
    buffer -> jsonstring;
    PWInterface ifReceive <- jsonstring;

    string[] split = ifReceive.id.Split('.');
    APMApiPublic.send((IntPtr)MetaData.APP_TYPE.NONE,
                          (IntPtr)Convert.ToInt64( split[1] ), buffer); //HANDLE(1)
}


'c# 언어 > 기타' 카테고리의 다른 글

Application.Perfomance.Management(Sending by Redis)  (0) 2022.01.13

Login After,,,,,,,,

Process.Start("APMCommManager.exe");

-APMCommManager.exe

Application.Run(new APMCommManagerForm()); //APMCommManager/Program.cs

public APMCommManagerForm() //APMCommManager/APMCommManagerForm.cs
{
    mainWindowHandle = (IntPtr)Convert.ToInt32( arguments[1] );
    APMApiPublic.PostMessage(Handle, APMApiPublic.UWM_APP_STARTUP, (IntPtr)0, (IntPtr)0 );
}

protected override void WndProc(ref Message m) //APMCommManager/APMCommManagerForm.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.UWM_APP_STARTUP:
        APMApiPublic.SendMessage(mainWindowHandle, APMApiPublic.UWM_APP_STARTUP, (intPtr)Handle, 
        (IntPtr)Process.GetCurrentProcess().id);
        break;
    }
}

-Basic Const Variables
protected override void WndProc(ref Message m) //APM/APMMain.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.UWM_APP_STARTUP:
        commHandle=APMMemory.GetInstance.APMCommManager=(IntPtr)m.WParam; 
        //public IntPtr APMCommManager
        break;
    }
}

- Form Button Query Click //APM/Screen/DBM/UAPDBMQ0010.cs
string query = string.Format(@"select * from table where flag = 1");
APMPublic.GetInstance.SendQuery(currentHandle, 2, 10, MetaData.APP_TYPE.QUERY.ToString(), query);

//APM/APMPublicLib/Common/APMPublic.cs
- SendQuery(IntPtr handle, int queryindex, int columnCnt, string clientMessageTarget, string query)
{
    string timestam[ = string.Format("{0:D10}.{1:D3}", Convert.ToInt64(handle.ToString()), queryindex);

    IntPtr result = APMapiPublic.send((IntPtr)MetaData.APP_TYPE_QUERY, APMMemory.GetInstance.APMCommManager, jsonstring);
    return result;
}

//APM/APMPublicLib/Common/APMPublic.cs
- public static IntPtr send(IntPtr wParam, IntPtr hWnd, byte[] data)
- public static IntPtr send(IntPtr wParam, IntPtr hWnd, string data)
{
    IntPtr result = SendMessage(hWnd, WM_COPYDATA, wParam, sendData);
    return result;
}

protected override void WndProc(ref Message m)//APM/APMCommManager/APMCommManagerForm.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.WM_COPYDATA:
        if(m.WParam==(IntPtr)MetaData.APP_TYPE.QUERY) brea;
    }

    SendToTail() //SendMessage Log Record!!

    byte[] jsonByte = Encoding.UTF8.GetBytes(jsonstring);
    sendQueue.Enqueue(jsonByte); //입력한다.

    if( ! ____sendWorker.IsBusy) ____sendWorker.RunWorkerAsync();
}

void ____sendWorker_DoWork(object sender, DoWorkEventArgs e)//APM/APMCommManager/APMCommManagerForm.cs
{
    byte[] jsonByte=sendQueue.Dequeue(); //꺼낸다.
    resultcode=____sendRedis.RPush("QCS", jsonByte); //통신시에는 byte단위를 사용
}

//APM/APMCommManager/APMCommManagerForm.cs
void ____sendWorker_Completed(object sender, CompletedEventArgs e)
{
    if(____sendQuquq.Count > 0)
        if(! ____sendWorker.IsBusy) ____sendWorker.RunWorkerAsync();
}




'c# 언어 > 기타' 카테고리의 다른 글

Application.Perfomance.Management(Receiving by Redis)  (0) 2022.01.14

/*
* C# - 마샬링이란(Marshalling)
* C# - 마샬링이란(Marshalling)
*/

1. 마샬링이란?

마샬링이란 한 객체의 메모리에서의 표현방식을 저장 또한 전송에 적합한 다른 데이터 형식으로 변환하는 과정입니다.
이는 데이터를 서로 다른 프로그램간에 전달할 필요가 있을 경우 사용합니다.
즉, 이는 직렬화와 유사하며 직렬화된 한 객체로, 멀리 떨어진 객체와 통신하기 위해 사용합니다.
이렇듯 복잡한 통신을 단순화하여 쉽게 데이터를 주고받을 수 있도록 해주는 것이 마샬링 입니다.

2. 프로그래밍에서의 마샬링

클라이언트가 서로 다른 프로세스, 원격지의 메서드를 호출해야한다고 가정합시다.
서버에 넘겨지는 인자, 리턴 값들을 프로그래밍 인터페이스에 맞도록 데이터를 조직화하고, 미리 정해진 다른 형식으로 변환합니다. 이것이 프로그래밍에서의 마샬링 입니다.
이는 XML로의 마샬링, Byte 스트림으로의 마샬링 등 다양한 방법이 있는데
이처럼 데이터 교환시 어떠한 정해진 표준에 맞게 해당 데이터를 가공하는 것이 마샬링이라면, 
가공된 데이터를 원격지에서 사용하기위한 과정을 언마샬링 이라고 합니다.

마살링도 참조 마샬링과 값 마샬링으로 구분할 수 있습니다.

참조 마샬링(MBR): MarshalByRefObject 를 상속
- 객체의 메모리를 통째로 저장한 후 다른 머신에서 객체를 복원해서 사용하는 기술
값 마샬링(MBV): Serializable Attribute를 지정하거나 ISerializable 인터페이스를 구현
- 참조 마샬링이란 객체를 핸들하기 위한 정보만을 묶어서 넘긴 후 그 정보를 이용해서 원격으로 객체를 핸들하는 기술

3. 결론

클라이언트에서 마샬링된 데이터를 서버나 다른 프로세스에 전달하게 되면, 
그 원격지에서는 데이터를 받아 언마샬링하여 사용함으로써 상호간의 통신하며 데이터를 사용할 수 있습니다.
이전 포스팅에서 프로세스 통신에 대해 소개한 적이 있는데, 
그 예제에서 사용했던 것이 바로 바이트 스트림으로의 마샬링 입니다.

Send    : string(Query) -> byte
Receive : byte -> string -> json(Data)

        public static void SendRedisDoWork(object sender, DoWorkEventArgs e)
        {
            string hostName = System.Environment.MachineName + "." +
               Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
                   "SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters").GetValue("Domain", "").ToString();

            RedisClient rc = new RedisClient(parms.Host, parms.Port);

            for (int i = 0; i < parms.NumMessages; i++)
            {
                JObject o = new JObject
                {
                    {"Application", "redis-generator"},
                    {"Host", hostName},
                    {"UtcTimestamp", DateTime.UtcNow.ToString("o")},
                    {"Type", "redis"},
                    {"Message", "redis message " + DateTime.UtcNow.ToString("o")},
                    {"Index", "logstash"}
                };
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(o.ToString());

                int restult = rc.RPush("QCS", bytes);
            }
        }

using System;

class Program
{
public static void Main()
{
int kk;
string str = "QUERY.0123456789.001";

string[] split = str.Split('.');

for(kk=0; kk<split.Length; kk++)
{
Console.WriteLine(">>>>[" + kk.ToString("0000") + "]:" + split[0] + "/" + split[1] + "/" + split[2]);
}
}
}

/*-------------------------------------------------------
>>>>[0000]:QUERY/0123456789/001
>>>>[0001]:QUERY/0123456789/001
>>>>[0002]:QUERY/0123456789/001
-------------------------------------------------------*/

+ Recent posts