Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Lawliet1
29 / 32 / 11
Регистрация: 30.09.2011
Сообщений: 202
Завершенные тесты: 1
#1

Не линкуется простенькая программа - C++ WinAPI

06.05.2016, 11:52. Просмотров 164. Ответов 1
Метки нет (Все метки)

Программа создает 4 окна и разбивает главное окно на 4 части, также создается 4 потока и они рисуют в этих 4 дочерних окнах... собственно программа отказывается линковаться(

Header.h
Кликните здесь для просмотра всего текста

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
51
#define NOMINMAX
 
#include <windows.h>
#include <process.h>
#include <cmath>
#include <string>
#include <random>
#include <algorithm>
 
//==========================================================
#ifndef UNICODE
using tstring = std::string;
 
template <typename T>
tstring to_tstring (const T& numb)
{ return std::to_string(numb); }
 
#else
using tstring = std::wstring;
 
template <typename T>
tstring to_tstring (const T& numb)
{ return std::to_wstring(numb); }
 
#endif
 
//==========================================================
typedef struct 
{
    HWND hwnd;
    int cxClient;
    int cyClient;
    int cyChar;
    bool bKill;
}
PARAM, *PPARAM;
 
//==========================================================
int CheckBottom (HWND, int, int, int);
 
VOID Thread1 (PVOID);
LRESULT APIENTRY WndProc1 (HWND, UINT, WPARAM, LPARAM);
 
VOID Thread2 (PVOID);
LRESULT APIENTRY WndProc2 (HWND, UINT, WPARAM, LPARAM);
 
VOID Thread3 (PVOID);
LRESULT APIENTRY WndProc3 (HWND, UINT, WPARAM, LPARAM);
 
VOID Thread4 (PVOID);
LRESULT APIENTRY WndProc4 (HWND, UINT, WPARAM, LPARAM);


Multi2.cpp
Кликните здесь для просмотра всего текста

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
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
131
132
133
134
135
136
137
#include "Header.h"
 
//==========================================================
LRESULT APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM);
 
//==========================================================
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szClsName[] = TEXT("Multy2");
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
 
    wndclass.cbSize         =  sizeof(wndclass);
    wndclass.style          =  CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    =  WndProc;
    wndclass.cbClsExtra     =  0;
    wndclass.cbWndExtra     =  0;
    wndclass.hInstance      =  hInstance;
    wndclass.hIcon          =  LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor        =  LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground  =  (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName   =  NULL;
    wndclass.lpszClassName  =  szClsName;
    wndclass.hIconSm        =  LoadIcon(NULL, IDI_APPLICATION);
 
    RegisterClassEx(&wndclass);
 
    hwnd = CreateWindow (
                          szClsName,
                          TEXT("Multittasking Demo"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          NULL, NULL, 
                          hInstance,
                          NULL
                        );
 
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
//==========================================================
LRESULT APIENTRY WndProc (HWND hwnd, UINT iMsg,
                          WPARAM wParam, LPARAM lParam)
{
    static TCHAR* szChildName[] = {
                                    TEXT("Child1"),
                                    TEXT("Child2"),
                                    TEXT("Child3"),
                                    TEXT("Child4")
                                  };
    static HWND hwndChild[4];
    static WNDPROC ChildProc[4] = { 
                                     WndProc1,
                                     WndProc2,
                                     WndProc3,
                                     WndProc4
                                  };
    int cxClient, cyClient;
    HINSTANCE hInstance;
    WNDCLASSEX wndclass;
 
    switch (iMsg)
    {
    case WM_CREATE:
        hInstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
 
        wndclass.cbSize          =   sizeof(wndclass);
        wndclass.style           =   CS_VREDRAW | CS_HREDRAW;
        wndclass.cbClsExtra      =   0;
        wndclass.cbWndExtra      =   0;
        wndclass.hInstance       =   hInstance;
        wndclass.hIcon           =   NULL;
        wndclass.hCursor         =   LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground   =   (HBRUSH) GetStockObject(WHITE_BRUSH);
        wndclass.lpszMenuName    =   NULL;
        wndclass.hIconSm         =   NULL;
 
        for (size_t j = 0; j != 4; ++j)
        {
            wndclass.lpfnWndProc   = ChildProc[j];
            wndclass.lpszClassName = szChildName[j];
 
            RegisterClassEx(&wndclass);
 
            hwndChild[j] = CreateWindow (
                                          szChildName[j],
                                          NULL,
                                          WS_CHILD | WS_BORDER | WS_VISIBLE,
                                          0, 0, 0, 0,
                                          hwnd,
                                          (HMENU) j,
                                          hInstance,
                                          NULL
                                        );
        }
        return 0;
 
    //********************************************
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
 
        for (size_t j = 0; j != 4; ++j)
            MoveWindow(hwndChild[j],
                       (j % 2) * cxClient / 2,
                       (j > 1) * cyClient / 2,
                       cxClient / 2,
                       cyClient / 2,
                       TRUE);
        return 0;
 
    //********************************************
    case WM_CHAR:
        if (wParam == TEXT('\x1B'))
            DestroyWindow(hwnd);
        return 0;
 
    //********************************************
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Child1.cpp
Кликните здесь для просмотра всего текста

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
51
52
53
54
55
56
57
58
59
#include "Header.h"
 
//==========================================================
VOID Thread1 (PVOID pVoid)
{
    long long iNumb = 0;
    int iLine = 0;
    HDC hdc;
    tstring str;
 
    PPARAM pparam = (PPARAM) pVoid;
 
    while (!pparam -> bKill)
    {
        if (iNumb < 0)
            iNumb = 0;
 
        str = to_tstring(iNumb++);
 
        iLine = CheckBottom(pparam -> hwnd,
                            pparam -> cyClient,
                            pparam -> cyChar,
                            iLine);
 
        hdc = GetDC(pparam -> hwnd);
        TextOut(hdc,
                0, iLine * pparam -> cyChar,
                str.c_str(), str.size());
        ReleaseDC(pparam -> hwnd, hdc);
 
        ++iLine;
    }
    _endthread();
}
 
//==========================================================
LRESULT APIENTRY WndProc1 (HWND hwnd, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    static PARAM param;
 
    switch (iMsg)
    {
    case WM_CREATE:
        param.hwnd = hwnd;
        param.cyChar = HIWORD(GetDialogBaseUnits());
        _beginthread(Thread1, 0, &param);
        return 0;
 
    case WM_SIZE:
        param.cyClient = HIWORD(lParam);
        return 0;
 
    case WM_DESTROY:
        param.bKill = true;
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Child2.cpp
Кликните здесь для просмотра всего текста

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "Header.h"
 
//==========================================================
VOID Thread2 (PVOID pVoid)
{
    long long iNumb = 0;
    int iLine, iSqrt, j;
    iLine = iSqrt = j = 0;
    tstring str;
    HDC hdc;
 
    PPARAM pparam = (PPARAM) pVoid;
 
    while (!pparam -> bKill)
    {
        do
        {
            if (++iNumb < 0)
                iNumb = 1;
 
            iSqrt = static_cast<int>(std::sqrt(iNumb));
 
            for (j = 2; j <= iSqrt; ++j)
                if (iNumb % j == 0)
                    break;
        }
        while (j <= iSqrt);
 
        str = to_tstring(iNumb);
 
        iLine = CheckBottom(pparam -> hwnd,
                            pparam -> cyClient,
                            pparam -> cyChar,
                            iLine);
 
        hdc = GetDC(pparam -> hwnd);
        TextOut(hdc,
                0, iLine * pparam -> cyChar,
                str.c_str(), str.size());
        ReleaseDC(pparam -> hwnd, hdc);
 
        ++iLine;
    }
    _endthread();
}
 
//==========================================================
LRESULT APIENTRY WndProc2 (HWND hwnd, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    static PARAM param;
 
    switch (iMsg)
    {
    case WM_CREATE:
        param.hwnd = hwnd;
        param.cyChar = HIWORD(GetDialogBaseUnits());
        _beginthread(Thread2, 0, &param);
        return 0;
 
    case WM_SIZE:
        param.cyClient = HIWORD(lParam);
        return 0;
 
    case WM_DESTROY:
        param.bKill = true;
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Child3.cpp
Кликните здесь для просмотра всего текста

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "Header.h"
 
//==========================================================
VOID Thread3 (PVOID pVoid)
{
    long long iPrev = 0, iNext = 1, iTemp = 0;
    int iLine = 0;
    tstring str;
    HDC hdc;
 
    PPARAM pparam = (PPARAM) pVoid;
 
    while (!pparam -> bKill)
    {
        if (iPrev < 0)
        {
            iPrev = 0;
            iNext = 1;
        }
 
        str = to_tstring(iPrev);
 
        iLine = CheckBottom(pparam -> hwnd,
                            pparam -> cyClient,
                            pparam -> cyChar,
                            iLine);
 
        hdc = GetDC(pparam -> hwnd);
        TextOut(hdc,
                0, iLine * pparam -> cyChar,
                str.c_str(), str.size());
        ReleaseDC(pparam -> hwnd, hdc);
 
        iTemp = iPrev;
        iPrev = iNext;
        iNext += iTemp;
 
        ++iLine;
    }
    _endthread();
}
 
//==========================================================
LRESULT APIENTRY WndProc3 (HWND hwnd, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    static PARAM param;
 
    switch (iMsg)
    {
    case WM_CREATE:
        param.hwnd = hwnd;
        param.cyChar = HIWORD(GetDialogBaseUnits());
        _beginthread(Thread3, 0, &param);
        return 0;
 
    case WM_SIZE:
        param.cyClient = HIWORD(lParam);
        return 0;
 
    case WM_DESTROY:
        param.bKill = true;
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Child4.cpp
Кликните здесь для просмотра всего текста

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
51
52
53
54
55
56
57
#include "Header.h"
 
//==========================================================
VOID Thread4 (PVOID pVoid)
{
    PPARAM pparam = (PPARAM) pVoid;
 
    std::default_random_engine dre;
    int iDiameter = 0;
    HDC hdc;
 
    while (!pparam -> bKill)
    {
        InvalidateRect(pparam -> hwnd, NULL, TRUE);
        UpdateWindow(pparam -> hwnd);
 
        std::uniform_int_distribution<int>
             diam(1, std::max(1, std::min(pparam -> cxClient, pparam -> cyClient)));
 
        iDiameter = diam(dre);
 
        hdc = GetDC(pparam -> hwnd);
        Ellipse(hdc,
                 (pparam -> cxClient - iDiameter) / 2,
                 (pparam -> cyClient - iDiameter) / 2,
                 (pparam -> cxClient + iDiameter) / 2,
                 (pparam -> cyClient + iDiameter) / 2);
        ReleaseDC(pparam -> hwnd, hdc);
    }
    _endthread();
}
 
//==========================================================
LRESULT APIENTRY WndProc4 (HWND hwnd, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    static PARAM param;
 
    switch (iMsg)
    {
    case WM_CREATE:
        param.hwnd = hwnd;
        param.cyChar = HIWORD(GetDialogBaseUnits());
        _beginthread(Thread4, 0, &param);
        return 0;
 
    case WM_SIZE:
        param.cyClient = HIWORD(lParam);
        param.cxClient = LOWORD(lParam);
        return 0;
 
    case WM_DESTROY:
        param.bKill = true;
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Helper.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "Header.h"
 
//==========================================================
int CheckBottom (HWND hwnd, int cyClient, int cyChar, int iLine)
{
    if (iLine * cyChar + cyChar > cyClient)
    {
        InvalidateRect(hwnd, NULL, TRUE);
        UpdateWindow(hwnd);
        iLine = 0;
    }
    return iLine;
}


Тут есть один нюанс, программа не линкуется, если библиотека времени выполнения (БВВ) - /MT или /MD, но она прекрасно линкуется и работает, если БВВ - /MTd /MDd... разницы, я особой не знаю (хотя может это ключ к решению проблемы), но знаю, что /MTd и /MDd используются для отладки и код компилируется с разным хламом, а /MT и /MD - для релиза, и если не линкуется в /MT и /MD - то программа кривая)

P.S: ошибки при линковке с /MT и /MD
0
Миниатюры
Не линкуется простенькая программа  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2016, 11:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не линкуется простенькая программа (C++ WinAPI):

Как запустить процесс из C#, если программа на С++ линкуется с динамическими DLL - Mono
Есть некая программа, написанная на плюсах. Задача - запустить прогу, получить из нее лог, распарсить лог как нужно. Проблема : не...

Простенькая программа - Программирование
Здравствуйте, товарищи программисты! Я совсем не программист, поэтому буду очень благодарен за развернутый ответ из оперы &quot;для...

Простенькая программа C# - C#
Доброго времени суток. Помогите пожалуйста! Нужна простенькая программа на C#, которая бы в себе имела: dll; файлы; классы(массив или...

Не работает простенькая программа! - C++
Вывести все &quot;счастливые&quot; четырехзначные числа по семь в строке. сколько таких чисел? Четырехзначное число является &quot;счастливым&quot;, если...

Глючит простенькая программа - Visual C++
Если кому не лень, посмотрите плз на мою прогу. Суть проблемы: есть простенькая, криво написанная (я создал over 9000 переменных, может...

Простенькая программа на андроиде - Программирование Android
Требуется написать несложную программу на андроиде, вращение одного предмета в трехмерном пространстве. Кто возьмется и какая цена вопроса?

1
Vort_
188 / 188 / 52
Регистрация: 10.07.2012
Сообщений: 400
11.05.2016, 12:52 #2
Вместо того, чтобы переделывать Debug конфигурацию на релизные библиотеки, надо просто переключиться на Release. И всё заработает. Если не заработает, значит надо создать новый проект.
1
Миниатюры
Не линкуется простенькая программа  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2016, 12:52
Привет! Вот еще темы с ответами:

Не работает простенькая программа - C (СИ)
Привет всем. Я изучаю язык С и сделал вот такую программку(сразу скажу что она запускается и выкидывает): #include&lt;stdio.h&gt; ...

Простенькая программа на fasm - Assembler
format PE console 4.0 include 'win32a.inc' mov EAX, 500d mov , 600d add EAX, cinvoke printf, a, EAX invoke sleep, 3000 ...

Нужна простенькая программа(внутри) - C#
)Ввести с клавиатуры Фамилию, Имя и Отчество. 2)Определить длину введенных строчек. 3)Вывести Вывести это все на экран и подсчитать...

Простенькая программа по расчету смс голосов - C++
Здравствуйте, не знаю к кому обратится нужно написать простенькую программу на С - пересчета голосов в якобы телевезионном танц марафоне с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru