300x250
반응형

이 메시지는 리소스 아이디가 없을때 발생 합니다.

 

먼저 확인해 볼수 있는건

 

DoDataExchange 함수안에  IDC_ 이름 값이 없거나 겹치는 부분을 확인 하시기 바랍니다.

    DDX_Control(pDX, IDC_COMBO1, m_combo_water_column);
    DDX_Control(pDX, IDC_EDIT4, m_down_factor);
    DDX_Control(pDX, IDC_BUTTON1, m_btn_applay);
    DDX_Control(pDX, IDC_EDIT_SMOOTHING, m_smoothing);
    DDX_Control(pDX, IDC_EDIT_BASE, m_base);
    DDX_Control(pDX, IDC_EDIT_ALTITUDE, m_altitude);

 

300x250
반응형
300x250
반응형

 

- 프로그램 강제 종료 방법(프로세스 명 입력)

              
              "ExpressVPN 부분은 프로세서 이름 변경"
                Process[] processList = Process.GetProcessesByName("ExpressVPN");
                for (int i = processList.Length - 1; i >= 0; i--)
                {
                    processList[i].Kill();
                    processList[i].Close();
                }

 

- 프로그램 실행 방법(파일경로, 프로그램이름 + 확장자 입력)

                //ExpressVPN.exe 변경, WorkingDirectory(폴더 위치) 변경
                System.Diagnostics.Process ps = new Process();
                ps.StartInfo.FileName = "ExpressVPN.exe";
                ps.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\ExpressVPN\\expressvpn-ui";
                ps.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
                ps.Start();

 

 

 

 

300x250
반응형

'윈도우 프로그래밍 > c#' 카테고리의 다른 글

c# ListView 복사 및 붙여넣기  (0) 2021.01.18
300x250
반응형

 

 

 

실행할 프로그램이 있는 위치에다가 아래 파일을 다운받아서 실행 하면 됩니다.

실행 후 10초 뒤에 프로그램 이 켜지고, 종료되면 도 켜집니다.

 

Start.bat 관련 코드는 아래와 같습니다.

아래 2군대 program.exe 를 실행할 파일로 이름바꺼주면 됩니다.

Timeout 10은 10초마다 감시 입니다. 감시 할 시간 변경 시 이름 바꺼주세요

@echo off

:repeat
Timeout 10 > NUL



@tasklist | find "program.exe" /c > NUL
IF %ErrorLevel%==1 goto 1
IF NOT %ErrorLevel%==1 goto 0



:0
goto repeat



:1
start program.exe
goto repeat

start.bat
0.00MB

 

 

 

 

300x250
반응형
300x250
반응형

 

1. const SetData(int data);

 

2. SetData(const int data);

 

3. SetData(int data) const;

 

 

 

300x250
반응형
300x250
반응형

 

 

Capture 함수를 호출 하면 됩니다.

file_name은

- 저장 파일 이름

- 절대 경로 + 파일이름

둘중 아무거나 넣어도 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void Capture(CString file_name)
{
    CRect rect;
    GetClientRect(rect);
 
    CWnd* pWndDesktop = GetDesktopWindow();
    CWindowDC ScrDC(pWndDesktop);
 
 
    i32 sx = rect.left;
    i32 sy = rect.top;
 
    CPoint offset = data_mgr->GetPopupOffset();
    sx += offset.x;
    sy += offset.y;
    
    i32 cx = rect.Width();
    i32 cy = rect.Height();
 
    CImage Image;
    (void)Image.Create(cx, cy, ScrDC.GetDeviceCaps(BITSPIXEL));
    CDC* pDC = CDC::FromHandle(Image.GetDC());
    (void)pDC->BitBlt(00, cx, cy, &ScrDC, sx, sy, SRCCOPY);
    Image.ReleaseDC();
 
    CString str_save;
    str_save = file_name;
    long result = Image.Save(str_save, Gdiplus::ImageFormatPNG);
 
    if (result < 0)
    {
        (void)AfxMessageBox(_T("캡쳐 오류"));
    }
}
cs

 

[정보가 도움이 되셨다면 광고 배너 클릭이 글쓴이의 활력이 됩니다.]

감사합니다.

300x250
반응형
300x250
반응형

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
void CPrintTestDlg::PrintOutImage(CString file_name)
{
    int nWidth, nHeight;
    CClientDC dc(this);//this->pImgWnd
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
 
    CRect rect;
    GetClientRect(rect);
    nWidth = rect.Width();
    nHeight = rect.Height();
 
    CBitmap BMP;
 
    CImage image;
    image.Load(file_name);
    if (image.IsNull() == false)
    {
        int si = image.GetWidth();
        int sih = image.GetHeight();
        BMP.Attach(image.Detach());
 
        HANDLE hDib;
        LPSTR pDib;
        LPBITMAPINFO lpBitInfo;
        HANDLE hlpBitInfo;
 
        hDib = GlobalAlloc(GHND, nWidth*nHeight * 3);
        pDib = (LPSTR)GlobalLock(hDib);
        hlpBitInfo = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + sizeof(BITMAPINFO));
        lpBitInfo = (LPBITMAPINFO)GlobalLock(hlpBitInfo);
 
        lpBitInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        lpBitInfo->bmiHeader.biWidth = nWidth;
        lpBitInfo->bmiHeader.biHeight = nHeight;
        lpBitInfo->bmiHeader.biPlanes = 1;
        lpBitInfo->bmiHeader.biBitCount = 24;
        lpBitInfo->bmiHeader.biCompression = BI_RGB;
        lpBitInfo->bmiHeader.biSizeImage = nWidth * nHeight * 3;
        lpBitInfo->bmiHeader.biXPelsPerMeter = 0;
        lpBitInfo->bmiHeader.biYPelsPerMeter = 0;
        lpBitInfo->bmiHeader.biClrUsed = 0;
        lpBitInfo->bmiHeader.biClrImportant = 0;
 
        HDC hdc = ::GetDC(this->m_hWnd);
        GetDIBits(hdc, (HBITMAP)BMP, 0, nHeight, pDib, lpBitInfo, DIB_RGB_COLORS);
        ::ReleaseDC(this->m_hWnd, hdc);
 
        static DOCINFO docinfo = { sizeof(DOCINFO), _T("프린트"), NULL };
 
 
        //팝업창 안띠우고 기본 설정 프린터로 인쇄
        CPrintDialog dlg(TRUE, PD_RETURNDEFAULT);
        dlg.DoModal();
 
        //팝업창 뛰우고 프린터 선택해서 인쇄
        /*CPrintDialog dlg(FALSE);
        if (dlg.DoModal() == IDCANCEL)
        {
 
        GlobalUnlock(hDib);
        GlobalFree(hDib);
        GlobalUnlock(hlpBitInfo);
        GlobalFree(hDib);
 
        DeleteObject(BMP.m_hObject);
 
        DeleteDC(MemDC.m_hDC);
        DeleteDC(dc.m_hDC);
 
        return;
        }*/
 
 
        DEVMODE *pDevmode = (DEVMODE*)dlg.GetDevMode();
        pDevmode->dmOrientation = 2;
        
        HDC hpdc = dlg.CreatePrinterDC();
 
        int cy = GetDeviceCaps(hpdc, VERTRES);
        int cx = GetDeviceCaps(hpdc, HORZRES);
 
        if (StartDoc(hpdc, &docinfo))
        {
            if (StartPage(hpdc))
            {
                StretchDIBits(hpdc,
                    00, cx, cy, 0, nHeight - sih, si, sih, pDib, lpBitInfo, DIB_RGB_COLORS, SRCCOPY);
                //image.StretchBlt(image.GetDC(), 0, 0, nWidth, nHeight, SRCCOPY);
                EndPage(hpdc);
            }
            EndDoc(hpdc);
        }
 
        GlobalUnlock(hDib);
        GlobalFree(hDib);
        GlobalUnlock(hlpBitInfo);
        GlobalFree(hlpBitInfo);
 
        DeleteObject(BMP.m_hObject);
 
        DeleteDC(dc.m_hDC);
        DeleteDC(MemDC.m_hDC);
        ::RestoreDC(hpdc, -1);
    }
}
cs

PrintTest.zip
0.24MB

 

 

 

 

 

 

 

 

300x250
반응형
300x250
반응형

std::string -> CString 변환

#include <string>

std::string str;
CString cstr(str.c_str());

 

 

CString -> std::string 변환

#include <string>

CString c_str = _T("Test");
std::string str = CT2CA(c_str);
300x250
반응형
300x250
반응형

UDP Multicast 테스트 프로그램 입니다.

1. 전송할 랜카드를 선택해 주세요(중요)

2. IP, PORT 입력 후 연결 클릭

3. 하단에 전송할 내용 입력 후 송신을 누르면 됩니다.

 

UDP Multicast 아이피 범위는 시작이 224 ~ 239로 시작해야 합니다.

(프로그램은 visual studio 2015로 제작되었습니다.)

 

 

 프로그램 다운로드(아래) 

Multicast Test.zip
0.07MB

 

 

[ 랜카드 목록 검색]

#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")
#include <vector>

    std::vector<std::string> vector_ethernet;
    std::vector<std::string> vector_ip;


    // 현재 연결된 인터넷에서 검색
    PIP_ADAPTER_INFO pAdapterInfo;
    pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
    ULONG buflen = sizeof(IP_ADAPTER_INFO);

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) {
        free(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
    }

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) {
        PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
        while (pAdapter)
        {
            vector_ethernet.push_back(pAdapter->Description);
            vector_ip.push_back(pAdapter->IpAddressList.IpAddress.String);

            pAdapter = pAdapter->Next;
        }
    }

위의 코드 적용 시

vector_ethernet 에는 랜카드 이름이

vector_ip 는 랜카드 ip가 추가됩니다.

 

 

 

 

[ 랜카드 선택]

IN_ADDR localaddr;
localaddr.s_addr = inet_addr(find_address.c_str());
int result_select = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF, (char*)&localaddr, sizeof(localaddr));

IP_ADD_MEMBERSHIP 을 사용해서 그룹에 조인 후에 사용해야 합니다.

 

 

아래 연결하는 풀 코드를 확인해 보세요

#include <string>
#include <WS2tcpip.h>

#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")

 

SOCKET socket_;
SOCKADDR_IN sock_addr{};
struct ip_mreq mreq{};

bool NetFrame::Create(const std::string &a_ip, const int a_port, const std::string &select_ip)
{
    bool result = false;

    closesocket(socket_);

    int nSocketType = SOCK_DGRAM;
    socket_ = socket(PF_INET, nSocketType, 0);

    if (socket_ != INVALID_SOCKET)
    {
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons(static_cast<u_short>(a_port));
        sock_addr.sin_addr.s_addr = INADDR_ANY;

        int optval = 1;

        setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval));

        if (bind(socket_, reinterpret_cast<SOCKADDR*>(&sock_addr), sizeof(sock_addr)) == 0)
        {
            result = true;

            if (false) // 내가 송신한 데이터는 안들어 오도록 설정
            {
                // https://wiki.kldp.org/HOWTO/html/Multicast/Multicast-HOWTO-6.html
                char loop = 0;
                int ret_val = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
            }

            //
            // Multicast 이더넷 선택 로직
            //
            //1. 멀티캐스트 라우터 테이블 추가
            mreq.imr_multiaddr.S_un.S_addr = inet_addr(a_ip.c_str());
            if (select_ip.empty())
                mreq.imr_interface.s_addr = htonl(INADDR_ANY);
            else
                mreq.imr_interface.s_addr = inet_addr(select_ip.c_str());
            int result_join = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
            if (result_join < 0)
                result = false;

            //2. 통신 인터페이스 선택(어떤걸 사용할 것인가)
            if (select_ip.empty() == false)
            {
                IN_ADDR localaddr;
                localaddr.s_addr = inet_addr(select_ip.c_str());
                int result_select = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF, (char*)&localaddr, sizeof(localaddr));
                if (result_select < 0)
                    result = false;
            }
        }

        inet_pton(sock_addr.sin_family, a_ip.c_str(), &sock_addr.sin_addr.s_addr);
    }

    return result;
}


std::string ip

std::ethernet_ip;
int net_port; 

 

Create(ip, port, ethernet_ip);

 

 

 

 

[ Wireshark로 전송 및 수신 확인]

랜카드 선택하는 부분은 예를들어 노트북에 랜카드가 연결되어있고 Wifi

이렇게 이더넷이 2개 연결된 상태에서

 

랜은 선택하는 설정을 안하면 멀티캐스트 전송 시

둘다 전송하는게 아니라 제일처음 전송한 2개중 1개로 계속 전송 하는 문제가 있습니다.

아래 그림처럼 이더넷, 이더넷 4 중 한곳으로 전송 됩니다.

 

이더넷 을 더블클릭 하시면 앞에 파란 버튼을 누르면 패킷 캡쳐가 시작됩니다.

udp로 검색을 하시면 UDP 데이터만 보여지게 되는데

아래 목록을 더블클릭 하시면 새창으로 정보를 확인할 수 있습니다.

 

아래 그림 처럼 Wireshark로 데이터 패킷을 확인해 보시면 어디로가는지 확인할 수 있습니다.

 

 

[기타 OS 없는 장비 전송 방법]

Dst 부분에 IPv4mcast로 되어 있어야 멀티 캐스트 전송입니다.

Dst Mac Adress는 01:05:5e 까지 나와야 합니다.

 

(OS가 있는 컴퓨터가 아닌 다른 펌웨어 기반 장비 개발은 아래와 같이 송신 아이피로 MAC Adress를 입력해줘야 전송이 되더라구요)

Mac Adress 계산은 

http://www.dqnetworks.ie/toolsinfo.d/multicastaddressing.html 사이트에서 보시면 될것 같습니다.

 

 

 

 

 

[정보가 도움이 되셨다면 광고 배너 클릭이 글쓴이의 활력이 됩니다.]

감사합니다.

 

 

 

 

 

300x250
반응형

+ Recent posts