Не линкуется простенькая программа
06.05.2016, 11:52. Показов 738. Ответов 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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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
|