Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270

Appcrash в callback функции вызываемой windows

28.05.2018, 10:52. Показов 2277. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть несколько проблем с приведенным далее кодом, сложности наблюдаются при асинхронной отправке результатов через callback INTERNET_STATUS_CALLBACK:
1.Если код запускать в том виде, в котором он представлен в листинге, то при запуске из IDE на windows xp с помощью F5 или ctrl+F5 и закрытии приложения через системное меню, т.е. вызывая функцию Form_Unload через несколько подобных запусков и остановок появляется сообщение о сбое приложения от ОС. Количество циклов варьируется от случая к случаю. В windows 8 такой проблемы не наблюдается. В win xp версия wininet.dll v8.00…, в win 8 v10.0.9200.
2.Если закомментировать строки в INTERNET_STATUS_CALLBACK №30 и 60, то в IDE проблема №1 не наблюдается. Т.е. намёк на проблему с объектом Debug в контексте INTERNET_STATUS_CALLBACK.
3.Компилируем проект как в листинге, настройки проекта, компиляции проекта – стандартные. Запускаем PE из windows epxlorer-a – проблем не наблюдается. Вариант по содержанию тот же, что и в пункте №2.
4.Если закомментировать строки в INTERNET_STATUS_CALLBACK №30 и 60, а со строк №20 и 70 комментарии снять, то в среде разработки что на windows xp, что на windows 8 проблем нет, но при компиляции со стандартными настройками проекта получаем исключение сходу в обеих ОС. Опять вызов метода объекта из пределов INTERNET_STATUS_CALLBACK.
5.Если закомментировать строки в INTERNET_STATUS_CALLBACK №20, 30, 60, 70, а со строки №0 снять комментарий, то в IDE на windows xp и windows 8 все нормально, а в скомпилированном файле на обеих ОС appcrash. Нет ссылки на объект, при том, что message box фактически выводится на экран, но после этого гарантированно происходит фатальное исключение.

Достаточно странное поведение. Что предпринималось: объявления внешних функций писались из msdn 2001 october, перепроверялись через онлайн справку msdn Microsoft. Ошибок найдено не было. Перепроверялись вызовы функций. Больше даже не знаю, что ещё можно попробовать, только переписать часть кода на C++, и отправлять результат в основной код. Если это конечно поможет. В чем может быть проблема?
Visual Basic
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
Содержимое формы frmMain.
 
Option Explicit
Private Const ERROR_SUCCESS                                         As Long = 0&
Private Declare Function InternetOpen Lib "C:\WINDOWS\system32\wininet.dll" Alias "InternetOpenA" ( _
    ByVal lpszAgent As String, _
    ByVal dwAccessType As Long, _
    ByVal lpszProxyName As String, _
    ByVal lpszProxyBypass As String, _
    ByVal dwFlags As Long _
    ) As Long
Private Declare Function InternetCloseHandle Lib "C:\WINDOWS\system32\wininet.dll" ( _
    ByVal hInternet As Long _
    ) As Long
Private Declare Function InternetConnect Lib "C:\WINDOWS\system32\wininet.dll" Alias "InternetConnectA" ( _
    ByVal hInternet As Long, _
    ByVal lpszServerName As String, _
    ByVal nServerPort As Integer, _
    ByVal lpszUsername As String, _
    ByVal lpszPassword As String, _
    ByVal dwService As Long, _
    ByVal dwFlags As Long, _
    ByRef dwContext As Long _
    ) As Long
Private Declare Function InternetAttemptConnect Lib "wininet.dll" ( _
    ByVal dwReserved As Long _
    ) As Long
Private Declare Function HttpOpenRequest Lib "C:\WINDOWS\system32\wininet.dll" Alias "HttpOpenRequestA" ( _
    ByVal hConnect As Long, _
    ByVal lpszVerb As String, _
    ByVal lpszObjectName As String, _
    ByVal lpszVersion As String, _
    ByVal lpszReferer As String, _
    ByVal lpszAcceptTypes As String, _
    ByVal dwFlags As Long, _
    ByRef dwContext As Long _
    ) As Long
Private Declare Function HttpEndRequest Lib "C:\WINDOWS\system32\wininet.dll" Alias "HttpEndRequestA" ( _
    ByVal hRequest As Long, _
    ByVal lpBuffersOut As Long, _
    ByVal dwFlags As Long, _
    ByVal dwContext As Long _
    ) As Long
Private Declare Function InternetOpenUrl Lib "C:\WINDOWS\system32\wininet.dll" Alias "InternetOpenUrlA" ( _
    ByVal hInternet As Long, _
    ByVal lpszUrl As String, _
    ByVal lpszHeaders As String, _
    ByVal dwHeadersLength As Long, _
    ByVal dwFlags As Long, _
    ByRef dwContext As Long _
    ) As Long
Private Declare Function HttpSendRequest Lib "C:\WINDOWS\system32\wininet.dll" Alias "HttpSendRequestA" ( _
    ByVal hRequest As Long, _
    ByVal lpszHeaders As String, _
    ByVal dwHeadersLength As Long, _
    ByVal lpOptional As String, _
    ByVal dwOptionalLength As Long _
    ) As Long
Private Declare Function InternetErrorDlg Lib "wininet.dll" ( _
    ByVal hwnd As Long, _
    ByVal hRequest As Long, _
    ByVal dwError As Long, _
    ByVal dwFlags As Long, _
    ByVal lppvData As Long _
    ) As Long
Private Const FLAGS_ERROR_UI_FILTER_FOR_ERRORS          As Long = &H1
Private Const FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS       As Long = &H2
Private Const FLAGS_ERROR_UI_FLAGS_GENERATE_DATA        As Long = &H4
Private Const FLAGS_ERROR_UI_FLAGS_NO_UI                As Long = &H8
Private Const FLAGS_ERROR_UI_SERIALIZE_DIALOGS          As Long = &H10
Private Declare Function InternetQueryDataAvailable Lib "wininet.dll" ( _
    ByVal hFile As Long, _
    ByRef lpdwNumberOfBytesAvailable As Long, _
    ByVal dwFlags As Long, _
    ByVal dwContext As Long _
    ) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" ( _
    ByVal hFile As Long, _
    ByVal lpBuffer As String, _
    ByVal dwNumberOfBytesToRead As Long, _
    ByRef lpdwNumberOfBytesRead As Long _
    ) As Long
Private Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" ( _
    ByVal hInternet As Long, _
    ByVal dwOption As Long, _
    ByVal lpBuffer As String, _
    ByVal lpdwBufferLength As Long _
    ) As Long
Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" ( _
    ByVal hInternet As Long, _
    ByVal dwOption As Long, _
    ByVal lpBuffer As Long, _
    ByVal dwBufferLength As Long _
    ) As Long
Private Const INTERNET_OPTION_CONNECT_TIMEOUT           As Long = 2
Private Const INTERNET_OPTION_CONNECT_RETRIES           As Long = 3
Private Const INTERNET_OPEN_TYPE_PRECONFIG              As Long = &H0&
Private Const INTERNET_DEFAULT_HTTPS_PORT               As Integer = 443
Private Const INTERNET_SERVICE_HTTP                     As Long = 3
Private Const INTERNET_FLAG_SECURE                      As Long = &H800000
Private Const INTERNET_FLAG_KEEP_CONNECTION             As Long = &H400000
Private Const INTERNET_FLAG_RELOAD                      As Long = &H80000000
Private Const INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS    As Long = &H4000&
Private Const INTERNET_FLAG_NO_AUTO_REDIRECT            As Long = &H200000
Private Const INTERNET_OPTION_SECURITY_CERTIFICATE      As Long = 35
Private Const INTERNET_OPTION_SECURITY_KEY_BITNESS      As Long = 36
Private Const INTERNET_OPEN_TYPE_DIRECT                 As Long = 1
Private Const HTTP_QUERY_RAW_HEADERS As Long = 21
Private Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" ( _
    ByVal hConnect As Long, _
    ByVal lpszHeaders As String, _
    ByVal dwHeadersLength As Long, _
    ByVal dwModifiers As Long _
    ) As Long
Private Const HTTP_ADDREQ_FLAG_ADD                      As Long = &H20000000
Private Const HTTP_ADDREQ_FLAG_ADD_IF_NEW               As Long = &H10000000
Private Const HTTP_ADDREQ_FLAG_COALESCE                 As Long = &H40000000
Private Const HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA      As Long = HTTP_ADDREQ_FLAG_COALESCE
Private Const HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON  As Long = &H1000000
Private Const HTTP_ADDREQ_FLAG_REPLACE                  As Long = &H80000000
Private Const HTTP_QUERY_FLAG_REQUEST_HEADERS           As Long = &H80000000
Private Const INTERNET_FLAG_ASYNC                       As Long = &H10000000
Private Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" ( _
    ByVal hRequest As Long, _
    ByVal lpBuffersIn As Long, _
    ByVal lpBuffersOut As Long, _
    ByVal dwFlags As Long, _
    ByVal dwContext As Long _
    ) As Long
Private Const HSR_ASYNC         As Long = &H1
Private Const HSR_SYNC          As Long = &H4
Private Declare Function InternetSetStatusCallback Lib "C:\WINDOWS\system32\wininet.dll" ( _
    ByVal hInternet As Long, _
    ByVal lpfnInternetCallback As Long _
    ) As Long
Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hRequest As Long, ByVal dwInfoLevel As Long, _
    ByVal lpvBuffer As String, ByRef lpdwBufferLength As Long, ByRef lpdwIndex As Long) As Long
Private lngContexValue As Long
Private Sub Form_Load()
    Dim strURL As String, lnghSendRequest As Long, lngRetval As Long
    lngContexValue = 1&
    glnghWnd = Me.hwnd
    lngHRootInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, INTERNET_FLAG_ASYNC)
    strURL = "yandex.ru"
    lnghSession = InternetConnect(lngHRootInternet, strURL, INTERNET_DEFAULT_HTTPS_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0&, ByVal lngContexValue)
    mlnghRequest = HttpOpenRequest(lnghSession, "GET", vbNullString _
        , vbNullString, vbNullString, vbNullString, INTERNET_FLAG_SECURE, ByVal lngContexValue)
    lngRetval = InternetSetStatusCallback(mlnghRequest, AddressOf INTERNET_STATUS_CALLBACK)
    HttpSendRequest mlnghRequest, vbNullString, 0&, vbNullString, 0&
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Dim lngRetval As Long
    lngRetval = InternetSetStatusCallback(mlnghRequest, 0&)
    lngRetval = HttpEndRequest(mlnghRequest, 0&, 0&, 0&)
    If mlnghRequest <> 0 Then InternetCloseHandle mlnghRequest
    If lnghSession <> 0 Then InternetCloseHandle lnghSession
    If lngHRootInternet <> 0 Then InternetCloseHandle lngHRootInternet
End Sub
Visual Basic
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
Содержимое стандартного модуля basModule.
 
Option Explicit
Public lngHRootInternet As Long, lnghSession As Long, mlnghRequest As Long
Private Const INTERNET_STATUS_REQUEST_COMPLETE As Long = 100
Private Declare Function InternetCloseHandle Lib "C:\WINDOWS\system32\wininet.dll" ( _
    ByVal hInternet As Long _
    ) As Long
Private Declare Function InternetQueryDataAvailable Lib "C:\WINDOWS\system32\wininet.dll" ( _
    ByVal hFile As Long, _
    ByRef lpdwNumberOfBytesAvailable As Long, _
    ByVal dwFlags As Long, ByVal dwContext As Long _
    ) As Long
Private Declare Function InternetReadFile Lib "C:\WINDOWS\system32\wininet.dll" ( _
    ByVal hFile As Long, _
    ByVal lpBuffer As String, _
    ByVal dwNumberOfBytesToRead As Long, _
    ByRef lpdwNumberOfBytesRead As Long _
    ) As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" ( _
    ByVal hwnd As Long, _
    ByVal lpText As String, _
    ByVal lpCaption As String, _
    ByVal wType As Long _
    ) As Long
Public glnghWnd As Long
Public Sub INTERNET_STATUS_CALLBACK( _
    ByVal hInternet As Long, _
    ByVal dwContext As Long, _
    ByVal dwInternetStatus As Long, _
    ByVal lpvStatusInformation As Long, _
    ByVal dwStatusInformationLength As Long _
    )
'0    MessageBox glnghWnd, "Callback", "MessageBox", 0&
10 '  MsgBox "1"
20 '  Async.frmMain.Print "dwContext = " & dwContext
30    Debug.Print "dwContext = " & dwContext
40    Select Case dwInternetStatus
        Case INTERNET_STATUS_REQUEST_COMPLETE
60            Debug.Print "INTERNET_STATUS_REQUEST_COMPLETE"
70 '            Async.frmMain.Print "INTERNET_STATUS_REQUEST_COMPLETE"
80 '            GetData hInternet
90    End Select
End Sub
Public Sub GetData( _
    ByVal lnghRequest As Long _
    )
    Dim lngDataLen As Long, lngNumOfBytesRead As Long, strBuff As String, strOutPutBuff As String, lngRetval As Long
    'Запрашиваем размер полученных данных.
    InternetQueryDataAvailable lnghRequest, lngDataLen, 0&, 0&
    'Размечаем массив под данные размером, который определен.
    strBuff = VBA.Strings.String(lngDataLen, vbNullChar)
    Do
        'Читаем данные в буфер.
        lngRetval = InternetReadFile(lnghRequest, strBuff, lngDataLen, lngNumOfBytesRead)
        'Проверяем прочитаны ли все данные.
        If lngNumOfBytesRead = 0 Then
            'Все данные прочитаны, выходим из цикла чтения.
            Exit Do
        Else
            'Есть ещё не прочитанные данные.
            strOutPutBuff = strOutPutBuff & strBuff
            'Запрашиваем размер непрочитанных данных.
            InternetQueryDataAvailable lnghRequest, lngDataLen, 0&, 0&
            'Подготавливаем буфер для чтения новой порции данных.
            strBuff = vbNullString
            strBuff = VBA.Strings.String(lngDataLen, vbNullChar)
        End If
    Loop
    Debug.Print strOutPutBuff
End Sub
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2018, 10:52
Ответы с готовыми решениями:

Return callback функции, вызываемой в цикле
Всем привет! Пишу extension для шаблонизатора, который получает через AJAX шаблон, в нем находит текст между специфическими тегами и...

Callback функции в Windows
Нужно получить runtime способность вызыва любой callback функции. Например обрабочики wndproc, enumwindows, enumfont, enumprocess и другие,...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

13
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.05.2018, 23:23
The callback function can be called in a thread context different from the thread that initiated the request.
Думаю проблема в этом.
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
29.05.2018, 10:16  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Думаю проблема в этом.
В приложении во всех случаях строго один поток.

Callback-и при например EnumWindows или EnumChildWindows работают без проблем.

Написал нативную dll на С++. Настройки проекта стандартные. Dll скомпилирована – релизная версия. Проблему №5 это решило.
Код dll:
Кликните здесь для просмотра всего текста

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
// prjHybridHttpsDll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "iostream.h"
#include "wininet.h"
 
HINTERNET hrootInternet, hSessionHandle, hRequest;
HANDLE hOutputConsole;          //Õýíäë output êîíñîëè.
 
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
};
 
 
void __stdcall INTERNET_STATUS_CALLBACK_FUNC(HINTERNET hInternet,
                                        DWORD dwContext,
                                        DWORD dwInternetStatus,
                                        LPVOID lpvStatusInformation,
                                        DWORD dwStatusInformationLength)
{
    MessageBox(NULL, "INTERNET_STATUS_CALLBACK_FUNC", "Message box", 0);
};
 
 
int __stdcall InitWininet(void)
{
    //Ðàçìå÷àåì êîíñîëü äëÿ òåêóùåãî ïîòîêà. 
    /*if (AllocConsole()==FALSE)
        return 0;
    else
    {
        //Ïîëó÷àåì õýíäë output êîíñîëè.
        hOutputConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    }*/
    //Ñîçäàåì êîðíåâîé õýíäë.
    hrootInternet = InternetOpen("App",INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
    //Ïðîâåðÿåì ñîçäàí ëè êîðíåâîé õýíäë.
    if(hrootInternet!=0)
    {
        //Ñîçäàåì ñåññèîííûé õýíäë.
        hSessionHandle = InternetConnect(hrootInternet, "www.yandex.ru", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
        //Ïðîâåðÿåì ñîçäàí ëè ñåññèîííûé õýíäë.
        if (hSessionHandle!=0)
        {
            //Ñîçäàåì õýíäë çàïðîñà.
            hRequest = HttpOpenRequest(hSessionHandle, "GET", NULL, NULL, NULL, NULL, INTERNET_FLAG_SECURE, 1);
            //Ïðîâåðÿåì ñîçäàë ëè çàïðîñ.
            if (hRequest!=0)
            {
                InternetSetStatusCallback(hRequest, &INTERNET_STATUS_CALLBACK_FUNC);
                //Ïðîèçâîäèì îòïðàâêó çàïðîñà.
                int iRetval;
                DWORD dwLastDllError;
                iRetval = HttpSendRequest(hRequest, NULL, 0, NULL, 0);
                dwLastDllError = GetLastError();
                if (((iRetval==0) && (dwLastDllError==997)) || (iRetval==1))
                {
                    //Óñïåøíîå âûïîëíåíèå îòïðàâêè çàïðîñà.
                    return -1;
                }
                else
                {
                    //Íåóñïåøíîå âûïîëíåíèå çàïðîñà.
                    return 0;
                }
        }
        else
            return 0;
    }
    else
        return 0;
    }
    else
        return 0;
};
 
int __stdcall TerminateWininet(void)
{
    InternetSetStatusCallback(hRequest, 0);
    HttpEndRequest(hRequest, NULL, NULL, NULL);
    if (hRequest!=0)
        InternetCloseHandle(hRequest);
    if (hSessionHandle!=0)
        InternetCloseHandle(hSessionHandle);
    if(hrootInternet!=0)
        InternetCloseHandle(hrootInternet);
    //Ïðîâåðÿåì ñîçäàíà ëè êîíñîëü.
    if (hOutputConsole!=0)
        FreeConsole();
    return 0;
};


Вызывающий код на VB:
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
Private Declare Function InitWininet Lib "prjHybridHttpsDll.dll" () As Long
Private Declare Function TerminateWininet Lib "prjHybridHttpsDll.dll" () As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" ( _
    ByVal hwnd As Long, _
    ByVal lpText As String, _
    ByVal lpCaption As String, _
    ByVal wType As Long _
    ) As Long
Private Sub Form_Load()
    MessageBox 0&, "Test", "Test", 0&
    Dim lngRetval As Long
    lngRetval = InitWininet
    Debug.Print "lngRetval = " & lngRetval
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Call TerminateWininet
End Sub
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
29.05.2018, 20:55
Цитата Сообщение от IDK Посмотреть сообщение
В приложении во всех случаях строго один поток.
Не имеет значения.

Цитата Сообщение от IDK Посмотреть сообщение
Callback-и при например EnumWindows или EnumChildWindows работают без проблем.
Там синхронный вызов.

Цитата Сообщение от IDK Посмотреть сообщение
Написал нативную dll на С++. Настройки проекта стандартные. Dll скомпилирована – релизная версия. Проблему №5 это решило.
Скинь проект и DLL, я тогда скажу (можно просто 2 EXE).
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
30.05.2018, 09:29  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не имеет значения.
Как можно поменять контекст потока? SetThreadContext kernel32?

Цитата Сообщение от The trick Посмотреть сообщение
Там синхронный вызов.
Синхронный вызов чего? EnumWindows? Или callback-а EnumWindows функции?

Цитата Сообщение от The trick Посмотреть сообщение
Скинь проект и DLL, я тогда скажу (можно просто 2 EXE).
Бинарники кодов с текстом как в сообщении №3 под катами.
VB.rar
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
30.05.2018, 09:44
Лучший ответ Сообщение было отмечено IDK как решение

Решение

Цитата Сообщение от IDK Посмотреть сообщение
Как можно поменять контекст потока? SetThreadContext kernel32?
Никак, можно сделать уведомление в основной поток, либо инициализировать рантайм.

Цитата Сообщение от IDK Посмотреть сообщение
Синхронный вызов чего? EnumWindows? Или callback-а EnumWindows функции?
Вызываешь EnumWindows и пока не будут вызваны все колбеки функция не вернет управление.

Цитата Сообщение от IDK Посмотреть сообщение
Бинарники кодов с текстом как в сообщении №3 под катами.
Проблема в том что библиотека выгружается после того как код завершается. При возврате из MessageBox выполнение соответственно переходит в выгруженный код библиотеки. Для исправления нужно либо дожидаться завершения кода callback либо просто не выгружать библиотеку после использования:
Visual Basic
1
2
3
4
5
6
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryW" (ByVal lpLibFileName As Long) As Long
Private Sub Form_Load()
    MessageBox 0&, "Test", "Test", 0&
    . . . .
    LoadLibrary StrPtr("prjHybridHttpsDll.dll")
End Sub
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
30.05.2018, 10:31  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Проблема в том что библиотека выгружается после того как код завершается. При возврате из MessageBox выполнение соответственно переходит в выгруженный код библиотеки. Для исправления нужно либо дожидаться завершения кода callback либо просто не выгружать библиотеку после использования:
Т.е. мне в prjHybridHttps.exe нужно добавить LoadLibrary? А зачем? В vb exe + dll cpp проблем нет. Вызов внешней функции не рушит приложение, callback выполняется столько раз, сколько нужно. Ошибки возникают тогда, когда я пытаюсь все это сделать только в vb. Вот проект где есть проблемы, причем проблемы как в PE так и при запуске в IDE:
Async.rar
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
30.05.2018, 10:39
Цитата Сообщение от IDK Посмотреть сообщение
Т.е. мне в prjHybridHttps.exe нужно добавить LoadLibrary? А зачем? В vb exe + dll cpp проблем нет.
Возникнет, если ты не закроешь MessageBox и закроешь приложение.

Цитата Сообщение от IDK Посмотреть сообщение
Ошибки возникают тогда, когда я пытаюсь все это сделать только в vb. Вот проект где есть проблемы, причем проблемы как в PE так и при запуске в IDE:
Я уже написал причину (попробуй переключится с MsgBox'а на форму, если MsgBox выполнялся бы в том же потоке то ты бы не смог бы переключится с модального окна в основное).
Как исправить? Зависит от того что ты хочешь делать в колбеке. Статьи о многопоточности у меня есть в блоге. Если будет конкретный код в колбеке я скажу как можно сделать.
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
01.06.2018, 15:42  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Я уже написал причину
Все теперь вижу, что два потока, а не только один primary.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
13.06.2018, 11:58
IDK, я сделал модуль где ты можешь использовать колбеки из разных потоков и отлаживать в IDE.
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
15.06.2018, 15:54  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
IDK, я сделал модуль где ты можешь использовать колбеки из разных потоков и отлаживать в IDE.
Хороший вариант, можно будет вникнуть, как будет время. Но, на данный момент альтернатива для меня - activeX exe проект компонента c thread per object настройкой. Там и отладка в IDE и все тоже самое, только не так красиво.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
15.06.2018, 16:01
Цитата Сообщение от IDK Посмотреть сообщение
Но, на данный момент альтернатива для меня - activeX exe проект компонента c thread per object
Не будет работать. Чтобы инициализировать рантайм нужно создать объект. Чтобы создать объект из CallBack нужно инициализировать рантайм.
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
16.06.2018, 02:57  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не будет работать.
Если вне процессный сервер(activeX exe) делать, то смысл в callback-е отпадает. А далее все по сути тоже, message loop, обработка событий - локальная для компонента или интерпроцессная, синхронные асинхронные вызовы методов объектов компонента в разных потоках.
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
16.06.2018, 10:05
Цитата Сообщение от IDK Посмотреть сообщение
Если вне процессный сервер(activeX exe) делать, то смысл в callback-е отпадает. А далее все по сути тоже, message loop, обработка событий - локальная для компонента или интерпроцессная, синхронные асинхронные вызовы методов объектов компонента в разных потоках.
Если делать без колбека то да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2018, 10:05
Помогаю со студенческими работами здесь

Не выводится printf в вызываемой функции функции
Сделал програмку с меню, в котором выбираешь посредством управления стрелочками. Но почему-то когда вызываются другие функции, то не...

Передать из вызываемой функции continue
Каким образом можно передать из вызываемой фукции оператор continue? Вкратце ситуация следующая: В цикле for, главной функции main(),...

Адрес ячейки в вызываемой функции
Коллеги, туплю ... 1. Написал VBA-функцию a() 2. Вызываю ее в ячейке =a() Вопрос: Как в коде вызванной функции узнать адрес...

Слишком мало аргументов вызываемой функции
привет)) такой вот вопросик) делаю структуру (это фрагмент кода) про помощи перечисляемого типа enum, тут надо вывести &quot;список&quot;...

Некорректная работа повторно вызываемой функции
wstring fdirection(void) { wcout &lt;&lt; L&quot;Введите путь к файлу, который хотите зашифровать (файл должен существовать): &quot; &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru