MinGW을 사용하면,서 libgcc_sdw2-1.dll 오류가 나는 경우가 있다.


 특히, C버전이 조금 낮은 경우에는 일어날 수 있는 오류이다.


 


이렇게 뜨게 된다.


이것을 처리하는 방법을 구글링하다가 알게된 것으로.


사이트


여기서 설명한 해결법은 static gcc을 설정하고, static lib std c++을 컴파일할때 추가하는 것이다.




이렇게 하면 이상없이 해결된다.


Posted by JunkMam
,
 *추신, 그냥 필자가 멋대로 테스트해본것으로 정말 이런지는 연습을 하면서 익혀보는 중이다.

 C언어와 C++는 비슷하다.

 필자는 클래스(Class)는 구조체(Struct)의 변형체로써 특정 기능(정확하게는 함수를 간단하게 구조체에 넣는 기능)이 붙어 있는 것이 클래스라고 본다.

 클래스의 변수를 맴버변수라고 하는데. 구조체의 변수 또한 맴버변수라고 한다.
 물론, 클래스에는 메소드가 있고, 구조체는 메소드랑 함수가 들어갈 수 없다.[C++에선 구조체에서도 함수가 들어간다고 하지만, 그것은 그냥 함수의 주소값을 넣는 것이다.]

 그래서 간단하게 C와 C++을 테스트해보았다.

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
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test1.cpp
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
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test.c


이렇게 해보았다.

여기서, gcc --save-temp과, g++ --save-temp를 이용해서 처리하는 것이다.


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
107
108
109
110
111
112
113
114
115
116
117
118
119
    .file    "test.c"
    .text
    .globl    _mkPerson
    .def    _mkPerson;    .scl    2;    .type    32;    .endef
_mkPerson:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $4, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $10, (%eax)
    leave
    ret
    .globl    _mkBaseballPlayer
    .def    _mkBaseballPlayer;    .scl    2;    .type    32;    .endef
_mkBaseballPlayer:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .globl    _mkEmployee
    .def    _mkEmployee;    .scl    2;    .type    32;    .endef
_mkEmployee:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    $600, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movb    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    leal    28(%esp), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    leal    24(%esp), %eax
    movl    %eax, (%esp)
    call    _mkBaseballPlayer
    leal    20(%esp), %eax
    movl    %eax, (%esp)
    call    _mkEmployee
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movzbl    4(%eax), %eax
    movsbl    %al, %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    _malloc;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test.s


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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    .file    "test1.cpp"
    .section    .text$_ZN6PersonC2Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC2Ev
    .def    __ZN6PersonC2Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC2Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN6PersonC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC1Ev
    .def    __ZN6PersonC1Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN14BaseballPlayerC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN14BaseballPlayerC1Ev
    .def    __ZN14BaseballPlayerC1Ev;    .scl    2;    .type    32;    .endef
__ZN14BaseballPlayerC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .section    .text$_ZN8EmployeeC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN8EmployeeC1Ev
    .def    __ZN8EmployeeC1Ev;    .scl    2;    .type    32;    .endef
__ZN8EmployeeC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $600, (%eax)
    movl    -4(%ebp), %eax
    movl    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ebx
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    movl    $4, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN6PersonC1Ev
    movl    %ebx, 28(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN14BaseballPlayerC1Ev
    movl    %ebx, 24(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN8EmployeeC1Ev
    movl    %ebx, 20(%esp)
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    movl    -4(%ebp), %ebx
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    __Znwj;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test1.s


이렇게 되어 있다.


여기서, test.s와 test1.s을 비교해봤다.


여기서 소스상에서 많이 차이가 없어 보인다.

여기서 차이가 있다면, cpp에서 생성자가 기본적으로 존재하고 [__ZN6PersonC1Ev], 이 후에 생성되는 생성자는 [__ZN6PersonC2Ev]가 되면서 추가되어서 생성자가 생성된다.


하지만, test1.cpp에서 Person 클래스에 생성자를 추가하지 않으면, 해당 소스에서 [__ZN6PersonC1Ev ] 같은 함수가 사라지고, 그냥 메모리 할당이 되는 것으로 된다.


하지만, 이것은 c에서는 생성자라는 함수가 있는 것이고 구조체가 그대로 사용되는 방식은 클래스랑 구조체랑 다른게 없다는걸 알게 되었다.


그래서 C++에서는 각각 구조체 변수를 사용할 수 있게 되어 있고 그것을 프로그래머가 알고 있다. 라는 가정으로 작업하게 만들기 때문에 super랑 base를 지원하지 않고, 다중 상속을 지원하는 것같다.

Posted by JunkMam
,

Windows MouseEvent 처리

연습 2016. 6. 13. 00:00

 마우스를 이동하는 것은 완료되었지만, 마우스를 클릭하는게 불가능하다.


 이걸 처리하기 위해서 검색한 것에서 mouse_event라는 함수등 다양한 방법으로 처리 방법을 설명한 사이트가 있다.


 http://www.dreamincode.net/forums/topic/8138-mouse-event/

 http://www.tipssoft.com/bulletin/board.php?bo_table=old_bbs&wr_id=186


 소스

 

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
#include <windows.h>
 
void ClickMouse(int parm_x, int parm_y, char parm_left_flag) 
  int x_pos = parm_x*65535/GetSystemMetrics(SM_CXSCREEN); 
  int y_pos = parm_y*65535/GetSystemMetrics(SM_CYSCREEN); 
 
  mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x_pos, y_pos, 
                                            0, GetMessageExtraInfo()); 
  if(parm_left_flag){ 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, 
                              x_pos, y_pos, 0, GetMessageExtraInfo()); 
      mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, 
                              x_pos, y_pos, 0, GetMessageExtraInfo()); 
  } else { 
      mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE, 
                              x_pos, y_pos, 0, GetMessageExtraInfo()); 
      mouse_event(MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE, 
                              x_pos, y_pos, 0, GetMessageExtraInfo()); 
  } 
 
 
int main(int argc, char** argv) {
    
    ClickMouse(1000,1000,1);
    
    return (EXIT_SUCCESS);
}
 
cs


 이렇게 되어 있는 정보에서 mouse_event라는 것이 처리 되는 것을 알 수 있다.


 특히, mouse_event 다음에 매개변수가 정의가 되어 있다.


 void mouse_event( DWORD event, DWORD posX, DWORD posY, DWORD data, ULONG_PTR extra);


 이렇게 되어 있다.


 전에 설명한, 마우스 커서 조절하는 것과 지금과 차이는 다음과 같다.


 SetCursorPos는 절대 위치값만을 처리한다.

 쉽게 말해서 100, 100이라면, 화면의 기준으로 이동하게 된다.


 반면, mouse_event는 MOUSEEVENTF_MOVE만을 사용하면 상대적 위치로 이동시키는 등. 설정을 할 수 있다.(그리고 동시에 적용 할 수 있다.)


 그 외에도 절대위치를 처리하기 위해선, MOUSEEVENTF_ABSOLUTE을 같이 사용해야된다.

 그리고 같이 사용하는 대신에 화면 크기를 short형으로 잡고 작업한다.

 화면 최대치가, short 최대치가 되는 것이다.


 GetSystemMetrics는 모니터의 해상도를 받아들이는 함수이다.


 즉, 절대값을 사용할려면, 비율을 알아야된다는 뜻이된다.


 예을 들어서 화면의 해상도가 x축이 1900이라고 했을때, x값은 65535가 되는 것이다.


 더 자세한 정보는 MSND을 참조하면 될 것 같다.


 참조 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms646260(v=vs.85).aspx

'연습' 카테고리의 다른 글

GCC로 Dynamic Library 만들기.  (0) 2016.06.15
GCC로 Static Library 만들기.  (0) 2016.06.14
Windows Local Host IPv4 주소 찾기.  (0) 2016.06.12
마우스 커서 위치 조절하기.  (0) 2016.06.11
GAS로 플로피 BootLoader 만들기.  (0) 2016.06.10
Posted by JunkMam
,

 IPv4의 주소를 알아보는 방법을 얻기 위해서, popen을 사용하는 방법을 찾았었다.


 하지만, 이것이 생각보다 불편하다.(각 열을 분석해서 출력해야되는 문제점이 있다.


 그래서 구글링을 해보니, gethostbyname[각주:1]라는 함수가 있다는 걸 알게 되었다.


 예시 사이트들이 많이 있는데, 그 중에 하나의 소스를 사용하고자 한다.


 예시 사이트 : 

 http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancednsrnr8e.html


 http://www.tenouk.com/Winsock/Winsock2example7.html


 http://stackoverflow.com/questions/26888853/ip-address-order-in-gethostbyname-function

 

 gethostbyname이라는 함수는 ipv4에 맞춰서 데이터를 가지는 구조체를 가지게 해주고, 해당 구조체에서 inet_ntoa 함수를 사용해서 십진수 3자리 4블럭으로 된 문자열을 출력한다.


 이걸 이용하면, 간단하게 현재 설정되어 있는 IPv4 값을 얻을 수 있게 되고, 이걸 이용해서 자동으로 ip을 생성하는 소스를 짤 수 있게 된다.


 다음은 예시 사이트에서 있는 답변 중 하나를 가지고 왔다.


 소스

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
#include <iostream>
#include <winsock.h>
 
#pragma comment(lib, "Ws2_32.lib")
 
int main()
{
    char hostname[255];
    struct hostent *he;
    struct in_addr **addr_list;
 
    WSAData data;
    WSAStartup(MAKEWORD(22), &data);
 
    gethostname(hostname, 255);
    std::cout << "Host name: " << hostname << std::endl;
 
    if ((he = gethostbyname(hostname)) == NULL) {
        std::cout << "gethostbyname error" << std::endl;
    } else {
        std::cout << "IP addresses: "  << std::endl;
        addr_list = (struct in_addr **)he->h_addr_list;
        for(int i = 0; addr_list[i] != NULL; i++) {
            std::cout << inet_ntoa(*addr_list[i]) << std::endl;
        }
    }
    
    return 0;
}
cs


 예시를 보면, 알겠지만, ws2_32.lib을 사용해줘야 한다.

 만약, #pragma comment(lib, "Ws2_32.lib")을 넣지 않으면, 사용자가 일일히 lib을 연결시켜 줘야 한다.

 예제

 gcc -o winsock winsock.c -lws2_32


 이렇게 사용하는 것이다.

  1. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738524(v=vs.85).aspx(2016-06-06) [본문으로]
Posted by JunkMam
,

 윈도우에서 마우스 커서 이동시키는 작업이 필요할 것 같아서 구글링을 해보았다.[각주:1][각주:2][각주:3][각주:4]


 먼저 알아야 되는 구조체는 다음과 같다.


 typedef struct tagPOINT {

   LONG x;

   LONG y;

 } POINT, *LPPOINT;


 이것은 position의 점을 정의 내리는 것으로 2차원 평면에서의 독립 변수 x, y를 가지는 구조체이다.

 마우스 커서 위치 또한 평면 위에 존재하는 것이기 때문에, POINT라는 값을 가진다.


 원본 함수.

 BOOL WINAPI GetCursorPos(

   _Out_ LPPOINT lpPoint

 );


 _Out_LPPPOINT라는 것은 POINT를 변수로 가지는 point 구조체 매개변수이다.

 여기에 값을 LPPOINT라는 걸로 가지기 때문에, POINT로 값을 가지고 올 수 있다.


 마우스 커서의 위치를 이동을 하도록 만드는 방법이 있다.


 마우스의 위치를 자동으로 할 수 있다.


 원본 함수.

 BOOL WINAPI SetCursorPos(

   _In_ int X,

   _In_ int Y

 );


 이것들은 전부다 정의한 것으로

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
#include <stdio.h>
 
#include <conio.h>
 
#include <windows.h>
 
int main()
{
    POINT p;
    
    printf("마우스 위치를 100, 100으로 이동시킵니다.\n");
    
    SetCursorPos(100,100);
    
    do{
        GetCursorPos(&p);
        printf("마우스 위치 (x, y) : (%d, %d)\n",p.x, p.y);
        if(kbhit())
        {
            break;
        }
    }while(1);
    
    return 0;
}
cs


 이런 소스를 만들면, 100, 100으로 이동한 후에 현재 마우스 위치를 파악할 수 있게 된다.

  1. http://breadlab.net/165 (2016-06-06) [본문으로]
  2. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648394(v=vs.85).aspx (2016-06-06) [본문으로]
  3. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648390(v=vs.85).aspx (2016-06-06) [본문으로]
  4. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648383(v=vs.85).aspx (2016-06-06) [본문으로]
Posted by JunkMam
,