Перенос исходного кода из Assembler на C++
25.10.2017, 15:49. Показов 1474. Ответов 4
Доброго времени суток форумчане!
Столкнулся с проблемой переноса кода на C++. По заданию, имеется исходный код на языке Assembler. Необходимо
перенести исходный код на C++. В результате, должна получить программа использующая WinAPI, отрисовывающая
окно, и несколько линий.
В принципе код я перенес, компиляция происходит без ошибок, однако окно не появляется. Подозревал что не правильно
отрабатывает функция создания и показа окна, но видимо это не так
Исходный код программы на языке Assembler
Assembler | 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
| include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
RoundedPath PROTO :DWORD
MiteredPath PROTO :DWORD
BeveledPath PROTO :DWORD
.data
hInstance dd 0
hWnd dd 0
hPen dd 0
oldPen dd 0
szClassName db "GDIPathsClass",0
szDisplayName db "GDI Paths",0
PathRound db "Rounded Path",0
PathMiter db "Mitered Path",0
PathBevel db "Beveled Path",0
.code
start:
invoke GetModuleHandle,0
mov hInstance,eax
invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL Wwd:DWORD
LOCAL Wht:DWORD
LOCAL Wtx:DWORD
LOCAL Wty:DWORD
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov eax,hInst
mov wc.hInstance,eax
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,OFFSET szClassName
invoke LoadIcon,hInst,500
mov wc.hIcon,eax
invoke LoadCursor,0,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx,ADDR wc
mov Wwd,500
mov Wht,350
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx,eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty,eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
0,0,
hInst,0
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,0,0,0
cmp eax,0
je ExitLoop
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL hDC:DWORD
LOCAL rct:RECT
LOCAL ps:PAINTSTRUCT
.if uMsg == WM_COMMAND
.elseif uMsg == WM_CREATE
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,ADDR ps
mov hDC,eax
;-----------------------------------
invoke SetMapMode,hDC,MM_ANISOTROPIC
invoke SetWindowExtEx,hDC,100,100,0
invoke GetClientRect,hWin,ADDR rct
invoke SetViewportExtEx,hDC,rct.right,rct.bottom,0
;-------------------------------------------------
invoke RoundedPath,hDC
invoke MiteredPath,hDC
invoke BeveledPath,hDC
;-------------------
invoke EndPaint,hWin,ADDR ps
xor eax,eax
ret
.elseif uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,0
xor eax,eax
ret
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
RoundedPath proc hDC:DWORD
LOCAL lb:LOGBRUSH
mov lb.lbStyle,BS_SOLID
mov lb.lbColor,00000FFh
mov lb.lbHatch,0
invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_ROUND or PS_JOIN_ROUND,10,ADDR lb,0,0
mov hPen,eax
invoke SelectObject,hDC,hPen
mov oldPen,eax
;-------------------
; Build the GDI Path
;-------------------
invoke BeginPath,hDC
invoke MoveToEx,hDC,10,25,0
invoke LineTo,hDC,20,75
invoke LineTo,hDC,30,25
invoke EndPath,hDC
;----------------------
; Render the built Path
;----------------------
invoke StrokePath,hDC
invoke DeleteObject,hPen
;---------------------------------
; Draw black lines inside the Path
;---------------------------------
invoke GetStockObject,BLACK_PEN
invoke SelectObject,hDC,eax
invoke MoveToEx,hDC,10,25,0
invoke LineTo,hDC,20,75
invoke LineTo,hDC,30,25
;--------------------------
; Describe the type of Path
;--------------------------
invoke TextOut,hDC,11,10,ADDR PathRound,12
invoke SelectObject,hDC,oldPen
ret
RoundedPath endp
MiteredPath proc hDC:DWORD
LOCAL lb:LOGBRUSH
mov lb.lbStyle,BS_SOLID
mov lb.lbColor,000FF00h
mov lb.lbHatch,0
invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_FLAT or PS_JOIN_MITER,10,ADDR lb,0,0
mov hPen,eax
invoke SelectObject,hDC,hPen
mov oldPen,eax
;-------------------
; Build the GDI Path
;-------------------
invoke BeginPath,hDC
invoke MoveToEx,hDC,40,25,0
invoke LineTo,hDC,50,75
invoke LineTo,hDC,60,25
invoke EndPath,hDC
;----------------------
; Render the built path
;----------------------
invoke StrokePath,hDC
invoke DeleteObject,hPen
;---------------------------------
; Draw black lines inside the Path
;---------------------------------
invoke GetStockObject,BLACK_PEN
invoke SelectObject,hDC,eax
invoke MoveToEx,hDC,40,25,0
invoke LineTo,hDC,50,75
invoke LineTo,hDC,60,25
;--------------------------
; Describe the type of Path
;--------------------------
invoke TextOut,hDC,41,10,ADDR PathMiter,12
invoke SelectObject,hDC,oldPen
ret
MiteredPath endp
BeveledPath proc hDC:DWORD
LOCAL lb:LOGBRUSH
mov lb.lbStyle,BS_SOLID
mov lb.lbColor,0FF0000h
mov lb.lbHatch,0
invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_SQUARE or PS_JOIN_BEVEL,10,ADDR lb,0,0
mov hPen,eax
invoke SelectObject,hDC,hPen
mov oldPen,eax
;-------------------
; Build the GDI Path
;-------------------
invoke BeginPath,hDC
invoke MoveToEx,hDC,70,25,0
invoke LineTo,hDC,80,75
invoke LineTo,hDC,90,25
invoke EndPath,hDC
;----------------------
; Render the built Path
;----------------------
invoke StrokePath,hDC
invoke DeleteObject,hPen
;---------------------------------
; Draw black lines inside the Path
;---------------------------------
invoke GetStockObject,BLACK_PEN
invoke SelectObject,hDC,eax
invoke MoveToEx,hDC,70,25,0
invoke LineTo,hDC,80,75
invoke LineTo,hDC,90,25
;--------------------------
; Describe the type of Path
;--------------------------
invoke TextOut,hDC,71,10,ADDR PathBevel,12
invoke SelectObject,hDC,oldPen
ret
BeveledPath endp
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim,1
shr wDim,1
mov eax,wDim
sub sDim,eax
mov eax,sDim
ret
TopXY endp
end start |
|
Исходный код программы на 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
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
| #include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "resource.h"
#define TEST_WM_001 102
#pragma warning (disable : 4996)
LPPAINTSTRUCT ps;
HWND hWnd;
HPEN hPen;
LPRECT rct;
HDC hDc;
LOGBRUSH lb;
HGDIOBJ oldPen;
char szClassName[] = "GDIPathsClass";
char szDisplayName[] = "GDI Paths";
char PathRound[] = "Закругленный путь";
char PathMiter[] = "Перемежный путь";
char PathBevel[] = "Распущенный путь";
HINSTANCE ghInstance; // Переменная для хранения хендела процесса
// Описание используемой оконной процедуры
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
int RoundedPath(HDC hDc);
int MiteredPath(HDC hDc);
int BeveledPath(HDC hDc);
int TopXY(DWORD wDim, DWORD sDim);
int WINAPI WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam);
// Главное приложение программы
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
int Wwd;
int Wht;
int Wtx;
int Wty;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW || CS_VREDRAW || CS_BYTEALIGNWINDOW;
//wc.lpfnWndProc = PviewDlgProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
wc.lpszMenuName = 0;
wc.lpszClassName = szClassName;
HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
//SendMessage(hWnd, WM_SETICON, 1, (LPARAM)hIcon);
LoadIcon(hInstance, (LPCSTR)IDI_ICON1);
wc.hIcon = hIcon;
LoadCursor(0, IDC_ARROW);
wc.hIconSm = 0;
RegisterClassEx(&wc);
Wwd = 500;
Wht = 350;
GetSystemMetrics(SM_CXSCREEN);
TopXY(Wwd, Wht);
Wtx = Wht;
GetSystemMetrics(SM_CYSCREEN);
TopXY(Wht, Wht);
Wty = Wht;
hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szClassName, szDisplayName, WS_OVERLAPPEDWINDOW, Wtx, Wty, Wwd, Wht, 0, 0, hInstance, 0);
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
HWND hWndDialog = hWnd;
MSG msg;
ghInstance = hInstance;
// Создание диалогового окна
//hWndDialog = CreateDialogParam(hInstance,
// MAKEINTRESOURCE(IDD_DIALOG1),
// NULL,
// (DLGPROC)PviewDlgProc,
// (LONG)0);
//// Стандартный цикл обработки сообщений приложения
while (GetMessage(&msg, NULL, 0, 0))
if (!IsDialogMessage(hWndDialog, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DestroyWindow(hWndDialog);
return 0;
}
int WINAPI WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
// Сообщение о инициализации диалогового окна
case WM_INITDIALOG:
break;
case WM_PAINT:
BeginPaint(hWnd, ps);
SetMapMode(hDc, MM_ANISOTROPIC);
SetWindowExtEx(hDc, 100, 100, 0);
GetClientRect(hWnd, rct);
SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
RoundedPath(hDc);
MiteredPath(hDc);
BeveledPath(hDc);
EndPaint(hWnd, ps);
// Сообщение о закрытии диалогового окна
case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return FALSE;
}
DefWindowProc(hWnd, wMsg, wParam, lParam);
return TRUE;
}
//Процедура обработки сообщений диалогового окна
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
// Сообщение о инициализации диалогового окна
case WM_INITDIALOG:
break;
case WM_PAINT:
BeginPaint(hWnd, ps);
SetMapMode(hDc, MM_ANISOTROPIC);
SetWindowExtEx(hDc, 100, 100, 0);
GetClientRect(hWnd, rct);
SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
RoundedPath(hDc);
MiteredPath(hDc);
BeveledPath(hDc);
EndPaint(hWnd, ps);
// Сообщение о закрытии диалогового окна
case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return FALSE;
}
//DefWindowProc(hWnd, wMsg, wParam, lParam);
return TRUE;
}
int RoundedPath(HDC hDc)
{
lb.lbStyle = BS_SOLID;
lb.lbColor = BLACK_BRUSH;
lb.lbHatch = 0;
ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_ROUND || PS_JOIN_ROUND, 10, &lb, 0, 0);
SelectObject(hDc, hPen);
BeginPath(hDc);
MoveToEx(hDc, 10, 25, 0);
LineTo(hDc, 20, 75);
LineTo(hDc, 30, 25);
EndPath(hDc);
StrokePath(hDc);
DeleteObject(hPen);
GetStockObject(BLACK_PEN);
SelectObject(hDc, oldPen);
MoveToEx(hDc, 10, 25, 0);
LineTo(hDc, 20, 75);
LineTo(hDc, 30, 25);
TextOut(hDc, 11, 10, PathRound, 12);
SelectObject(hDc, oldPen);
return TRUE;
}
int MiteredPath(HDC hDc)
{
lb.lbStyle = BS_SOLID;
lb.lbColor = BLACK_BRUSH;
lb.lbHatch = 0;
ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
SelectObject(hDc, hPen);
BeginPath(hDc);
MoveToEx(hDc, 40, 25, 0);
LineTo(hDc, 50, 75);
LineTo(hDc, 60, 25);
EndPath(hDc);
StrokePath(hDc);
DeleteObject(hPen);
GetStockObject(BLACK_PEN);
SelectObject(hDc, oldPen);
MoveToEx(hDc, 40, 25, 0);
LineTo(hDc, 50, 75);
LineTo(hDc, 60, 25);
TextOut(hDc, 41, 10, PathMiter, 12);
SelectObject(hDc, oldPen);
return TRUE;
}
int BeveledPath(HDC hDc)
{
lb.lbStyle = BS_SOLID;
lb.lbColor = BLACK_BRUSH;
lb.lbHatch = 0;
ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
SelectObject(hDc, hPen);
BeginPath(hDc);
MoveToEx(hDc, 70, 25, 0);
LineTo(hDc, 80, 75);
LineTo(hDc, 90, 25);
EndPath(hDc);
StrokePath(hDc);
DeleteObject(hPen);
GetStockObject(BLACK_PEN);
SelectObject(hDc, oldPen);
MoveToEx(hDc, 70, 25, 0);
LineTo(hDc, 80, 75);
LineTo(hDc, 90, 25);
TextOut(hDc, 71, 10, PathBevel, 12);
SelectObject(hDc, oldPen);
return TRUE;
}
int TopXY(DWORD wDim, DWORD sDim)
{
sDim = sDim << 1;
wDim = wDim << 1;
return sDim -= wDim;
} |
|
Программа должна иметь следующий вид:
Подскажите пожалуйста, в чем может быть проблема?
0
|