Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
MASM

Гиперссылка (подклассирование статического элемента управления)

20.04.2020, 10:47. Показов 3644. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гиперссылка на ассемблере (подклассирование статического элемента управления).Помогите пожалуйста
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
.386
.model flat, stdcall   
option casemap :none
include \masm32\include\windows.inc  
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc  
include \masm32\include\gdi32.inc  
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib        
    WndProc PROTO : DWORD,: DWORD,: DWORD,: DWORD
    HyperLink PROTO : DWORD, : DWORD
    HyperLinkWndProc PROTO : DWORD, : DWORD, : DWORD, : DWORD
.const
    IDC_URL     equ 100
    IDC_MAIL    equ 101   
.data
    dlgname db "URL",0
    szOpen  db "open",0 ;tells shellexacute to open the link
.data? 
    buffer      db 255 dup (?) ;Buffer to hold our string
    hInstance   dd ?           ;Instance of the program
    hFinger     dd ?           ;Holder for the cursor
.code
start:
    invoke GetModuleHandle, NULL
        mov hInstance, eax        
    invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
        invoke ExitProcess,eax
WndProc proc hWin:  DWORD,uMsg: DWORD,wParam: DWORD,lParam: DWORD
    .if uMsg == WM_INITDIALOG
        invoke HyperLink, hWin, IDC_URL     ;Turn the url into a hyperlink
        invoke HyperLink, hWin, IDC_MAIL    ;Turn the e-mail into a hyperlink
            invoke LoadCursor,hInstance,101 ;Load our custom cursor into memory
                mov hFinger,eax             ;Save Its handle
                    xor eax,eax             ;Return falsw
                        ret
    .elseif uMsg == WM_CTLCOLORSTATIC
        invoke SendMessage,lParam,uMsg,wParam,lParam    ;We want to hook this message to our hyperlink function
            ret
    .elseif uMsg == WM_CLOSE
        invoke EndDialog,hWin,0
            xor eax,eax
                ret
    .endif
        xor eax,eax
            ret
WndProc endp
 
HyperLink proc hDlg: DWORD, nID: DWORD
    invoke GetDlgItem, hDlg, nID        ;Get the handle of our item
        push eax                        ;save it
    invoke SetWindowLong, eax, GWL_WNDPROC, addr HyperLinkWndProc   ;subclass our static window
        pop edx                             ;Restore saved eax into eax
    invoke SetWindowLong, edx, GWL_USERDATA, eax    ;Set new value
        ret
HyperLink endp
 
HyperLinkWndProc PROC uses ebx, hWnd: DWORD,uMsg: DWORD,wParam: DWORD,lParam: DWORD
LOCAL tmpFont  : LOGFONT 
    .IF uMsg==WM_CTLCOLORSTATIC                     ;Color our static windows
        invoke SendMessage, hWnd, WM_GETFONT, 0, 0  ;Get the defualt system font
            mov edx,eax                             ;store result
                invoke GetObject, edx, sizeof LOGFONT, addr tmpFont ;get our font into a logfont structure
                    mov tmpFont.lfUnderline, TRUE ;under line the link
                        invoke CreateFontIndirect, addr tmpFont ;Create the new font
                            mov ebx,eax                         ;We need the return to free the memory later
                            invoke SelectObject, wParam, ebx    ;Select our control
                        invoke SetTextColor, wParam, Blue ;change this to change the color of the link
                        invoke GetSysColor, COLOR_MENU    ;background is = to the system menu
                        invoke SetBkColor, wParam, eax    ;Set the color
                        invoke DeleteObject,ebx           ;Free memory used for font creatin
                        invoke GetStockObject, HOLLOW_BRUSH ;Return painting with a hollow brush
                            ret 
    .ELSEIF uMsg==WM_NCHITTEST
        mov eax, 1 ;We want to handle the non client hit test so we return true or 1
            ret
    .ELSEIF uMsg==WM_LBUTTONDOWN
        invoke GetWindowText,hWnd,offset buffer,sizeof buffer ;change this for using a preset url
            invoke ShellExecute, NULL, offset szOpen, offset buffer, NULL, NULL, SW_SHOWNORMAL ;change this to represent your preset url
                xor eax,eax
                    ret
    .ELSEIF uMsg==WM_SETCURSOR
        invoke SetCursor,hFinger
            xor eax,eax
                ret
    .ENDIF
        invoke GetWindowLong, hWnd, GWL_USERDATA 
            invoke CallWindowProc, eax, hWnd, uMsg, wParam, lParam 
                ret
HyperLinkWndProc endp
end start
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.04.2020, 10:47
Ответы с готовыми решениями:

В чем отличия пользовательского элемента управления от настраиваемого элемента управления?
В чем отличия пользовательского элемента управления от настраиваемого элемента управления в контексте Windows Forms?

Гиперссылка. Копирование из ячейки и вставка как гиперссылка
Добрый день! Помогите, пожалуйста? У меня есть таблица. В первой ячейке стоит название сайта. Во второй - адрес сайта. Нужно из...

Перенос текста из элемента управления одной формы на элемент управления другой
Здрасте, нужна помощь!) Мне нужно чтобы когда я ввожу в поле Text какую либо запись в одной форме и при нажатии на кнопку оно...

9
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
20.04.2020, 13:32  [ТС]
Компиляция без ошибок, но когда запускаю программу она открывается и сразу исчезает, ничего не выполняет, нет диалогового окна ...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
20.04.2020, 14:05
Лучший ответ Сообщение было отмечено IRA9163 как решение

Решение

Теряюсь сказать правильно...

Взял ваш исходник, убедился в первичном "диагнозе", выполнил в отладчике по шагам. Увидел, что вызов DialogBoxParam завершается со значением (-1), т.е. по ошибке - смотрите описание в MSDN
https://docs.microsoft.com/en-... gboxparama

Добавил визуализацию кода ошибки - т.е. GetLastError и получил
DialogBoxParam failed with error 1812: Указанный файл образа не содержит секции ресурсов
Приведу дополнения для расшифровки ошибки - делал их на основе MSDN https://docs.microsoft.com/ru-... -directory
Кликните здесь для просмотра всего текста
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
.386
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\shell32.inc
        include \masm32\include\gdi32.inc
 
        includelib \masm32\lib\shell32.lib
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\gdi32.lib
 
        WndProc                 PROTO   :DWORD, :DWORD, :DWORD, :DWORD
        HyperLink               PROTO   :DWORD, :DWORD
        HyperLinkWndProc        PROTO   :DWORD, :DWORD, :DWORD, :DWORD
 
        DisplayErrorBox         PROTO   :DWORD
 
.const
    IDC_URL     equ 100
    IDC_MAIL    equ 101
.data
    dlgname db "URL",0
    szOpen  db "open",0 ;tells shellexacute to open the link
        aszFail                 db      'DialogBoxParam', 0
.data?
    buffer      db 255 dup (?) ;Buffer to hold our string
    hInstance   dd ?           ;Instance of the program
    hFinger     dd ?           ;Holder for the cursor
.code
start:
        invoke GetModuleHandle, NULL
        mov hInstance, eax
        invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
        cmp     eax,    0
        jg     @f
                invoke  DisplayErrorBox,        ADDR aszFail
        @@:
 
 
        invoke ExitProcess,eax
 
WndProc proc hWin:  DWORD,uMsg: DWORD,wParam: DWORD,lParam: DWORD
    .if uMsg == WM_INITDIALOG
        invoke HyperLink, hWin, IDC_URL     ;Turn the url into a hyperlink
        invoke HyperLink, hWin, IDC_MAIL    ;Turn the e-mail into a hyperlink
        invoke LoadCursor,hInstance,101 ;Load our custom cursor into memory
        mov hFinger,eax             ;Save Its handle
        xor eax,eax             ;Return falsw
        ret
    .elseif uMsg == WM_CTLCOLORSTATIC
        invoke SendMessage,lParam,uMsg,wParam,lParam    ;We want to hook this message to our hyperlink function
        ret
    .elseif uMsg == WM_CLOSE
        invoke EndDialog,hWin,0
        xor eax,eax
        ret
    .endif
    xor eax,eax
    ret
WndProc endp
 
HyperLink proc hDlg: DWORD, nID: DWORD
        invoke GetDlgItem, hDlg, nID        ;Get the handle of our item
        push eax                        ;save it
        invoke SetWindowLong, eax, GWL_WNDPROC, addr HyperLinkWndProc   ;subclass our static window
        pop edx                             ;Restore saved eax into eax
        invoke SetWindowLong, edx, GWL_USERDATA, eax    ;Set new value
        ret
HyperLink endp
 
HyperLinkWndProc PROC uses ebx, hWnd: DWORD,uMsg: DWORD,wParam: DWORD,lParam: DWORD
LOCAL tmpFont  : LOGFONT
    .IF uMsg==WM_CTLCOLORSTATIC                     ;Color our static windows
        invoke SendMessage, hWnd, WM_GETFONT, 0, 0  ;Get the defualt system font
            mov edx,eax                             ;store result
                invoke GetObject, edx, sizeof LOGFONT, addr tmpFont ;get our font into a logfont structure
                    mov tmpFont.lfUnderline, TRUE ;under line the link
                        invoke CreateFontIndirect, addr tmpFont ;Create the new font
                            mov ebx,eax                         ;We need the return to free the memory later
                            invoke SelectObject, wParam, ebx    ;Select our control
                        invoke SetTextColor, wParam, Blue ;change this to change the color of the link
                        invoke GetSysColor, COLOR_MENU    ;background is = to the system menu
                        invoke SetBkColor, wParam, eax    ;Set the color
                        invoke DeleteObject,ebx           ;Free memory used for font creatin
                        invoke GetStockObject, HOLLOW_BRUSH ;Return painting with a hollow brush
                            ret
    .ELSEIF uMsg==WM_NCHITTEST
        mov eax, 1 ;We want to handle the non client hit test so we return true or 1
            ret
    .ELSEIF uMsg==WM_LBUTTONDOWN
        invoke GetWindowText,hWnd,offset buffer,sizeof buffer ;change this for using a preset url
            invoke ShellExecute, NULL, offset szOpen, offset buffer, NULL, NULL, SW_SHOWNORMAL ;change this to represent your preset url
                xor eax,eax
                    ret
    .ELSEIF uMsg==WM_SETCURSOR
        invoke SetCursor,hFinger
            xor eax,eax
                ret
    .ENDIF
        invoke GetWindowLong, hWnd, GWL_USERDATA
            invoke CallWindowProc, eax, hWnd, uMsg, wParam, lParam
                ret
HyperLinkWndProc endp
 
;-------------------------------------------------------------------
.data
        aszErrorMessage db      "%s failed with error %d: %s", 0
        aszMBError      db      "Error", 0
.code
DisplayErrorBox proc    lpszFunction:DWORD
        local   lpMsgBuf:DWORD
        local   lpDisplayBuf:DWORD
        local   LastError:DWORD
 
        ;Retrieve the system error message for the last-error code
        invoke  GetLastError
        mov     [LastError],    eax
 
        invoke  FormatMessage,\
                FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,\
                NULL,\
                [LastError],\
                LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10),\
                ADDR lpMsgBuf,\
                0,\
                NULL
        ;Display the error message and clean up
 
        ;lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        ;  (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
        mov     ebx,    eax     ;ebx=lstrlen((LPCTSTR)lpMsgBuf)
        invoke  lstrlen,        [lpszFunction]
        add     ebx,    eax
        add     ebx,    40
        invoke  LocalAlloc,     LMEM_ZEROINIT, ebx
        mov     [lpDisplayBuf], eax
        ;
        invoke  wsprintf,       [lpDisplayBuf], \
                ADDR aszErrorMessage, [lpszFunction],\
                [LastError], [lpMsgBuf]
        ;
        invoke  MessageBox,     NULL, [lpDisplayBuf], ADDR aszMBError, MB_OK
 
        invoke  LocalFree,      [lpMsgBuf]
        invoke  LocalFree,      [lpDisplayBuf]
        ret
DisplayErrorBox endp
 
end start
Т.е. для работы программы недостаёт файла ресурсов, в котором описаны какие-то данные для диалогов, курсоров, прочего.
1
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
20.04.2020, 14:56  [ТС]
Подскажите пожалуйста как подключить файл ресурсов (url.rc). Какая именно команда должна быть и в каком месте в программе это надо написать. Заранее спасибо
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
20.04.2020, 15:06
Лучший ответ Сообщение было отмечено IRA9163 как решение

Решение

Файл ресурсов нужно сначала скомпилировать компилятором ресурсов, а потом при компоновке указать необходимость включения ресурсов в исполняемый файл.

Детали не помню, обычно смотрю всё среди примеров к masm32.

Добавлено через 5 минут
Вот нашел какой-то пример
Компиляция самого файла
Windows Batch file
1
\MASM32\BIN\Ml.exe /c /coff bmbutton.asm
Компиляция файла ресурсов
Windows Batch file
1
2
\MASM32\BIN\Rc.exe /v rsrc.rc
\MASM32\BIN\Cvtres.exe /machine:ix86 rsrc.res
Компоновка
Windows Batch file
1
\MASM32\BIN\Link.exe /SUBSYSTEM:WINDOWS bmbutton.obj rsrc.obj
Понятно, что у вас другие названия, но тут главное видеть командную строку.
1
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
24.04.2020, 21:55  [ТС]
При компоновке этой программы возникла ошибка
LINK: fatal error LNK1104: can not open file "url111.exe"
компиляция самого файла и файла ресурсов проходит успешно. Помогите пожалуйста исправить ошибку. Заранее спасибо.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
24.04.2020, 22:24
Сложно сказать...
Покажите файлы asm, rc, команды компиляции и компоновки.
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
25.04.2020, 13:05  [ТС]
команды компиляции и компоновки:
C:\Windows\System32>\masm32\bin\ml.exe /c /coff \masm32\111\url111.asm
C:\Windows\System32>\masm32\bin\rc.exe /v \masm32\111\url.rc
C:\Windows\System32>\masm32\bin\Cvtres.e xe /machine:ix86 \masm32\111\url.res
C:\Windows\System32>\masm32\bin\Link.exe /SUBSYSTEM:WINDOWS \masm32\111\url111.obj \masm32\111\url.obj

\111\ это папка в которой находятся все файлы
Вложения
Тип файла: zip url.zip (2.3 Кб, 10 просмотров)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
25.04.2020, 14:55
Лучший ответ Сообщение было отмечено IRA9163 как решение

Решение

Смотрите, я собрал файлы из папки в одном месте.
Запустил пакетник для компиляции
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
@set ResourceName=url
@set AsmSourceName=url111
 
 
set MASM_Path=d:\masm32\bin
%MASM_Path%\Rc.exe /v %ResourceName%.rc
%MASM_Path%\Cvtres.exe /machine:ix86 %ResourceName%.res
@pause
 
@del %AsmSourceName%.obj > NUL
@del %AsmSourceName%.exe > NUL
@del %AsmSourceName%.com > NUL
@echo on
 
d:\masm32\bin\ml.exe /Fl /c /coff /X /Id:\ %AsmSourceName%.asm
d:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS %AsmSourceName%.obj %ResourceName%.obj
@pause
Получил исполняемый файл. При запуске которого - маленькое окошко
Название: url111.PNG
Просмотров: 101

Размер: 5.8 Кб
Всё в порядке.

Возможно, что на вашем компьютере url111.exe выполнялся, был занят отладчиком, или антивирус не позволял link.exe создавать исполняемые файлы, или проактивная защита не давала заменить существующий url111.exe на новый.
1
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 10
25.04.2020, 18:22  [ТС]
ФедосеевПавел,программа уже работает. Большое Вам спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2020, 18:22
Помогаю со студенческими работами здесь

Автоматическое изменение размера элемента управления в пользовательском элементе управления
Добрый день, коллеги! Есть пользовательский элемент управления. В составе есть только TextBox. Есть процедуры контроля вводимых...

Удаление элемента из статического массива
Дан двоичный файл с целыми числами. Удалить из него число, записанное после первого нуля (принять, что нули в файле имеются). Результат...

Удаление элемента из середины массива(статического)
Хотелось бы узнать как удалить элемент из середины массива(не динамического, не вектора). Не могли бы вы написать простенькую программу для...

Затруднение с удалением элемента и образованием нового размера статического массива
Здравствуйте, существует затруднение в программном формулировании удаления элементов из массива. Задача выглядит так: Есть массив...

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке
Привет :) Есть задача - нужно динамически добавлять компоненты. Все работает хорошо. Но если добавлять через цикл то начинает зависать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru