Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

Создание эмулятора браузера для отправки запросов

20.05.2015, 11:44. Показов 4678. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова!
Как можно создать эмулятор браузера чтобы запросы были такие как и в реальном браузере.
curl когда например используешь, бывает страницы где идет запрос через JavaScript, а javascript хз. какой код отправляет из за этого не получается ботов создать. Как можно сделать программку чтобы как реальный браузер посылала запросы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2015, 11:44
Ответы с готовыми решениями:

Приложении для отправки XML запросов на cucm
требуется написать программу на C++ или на delphi для отправки xml запросов в базу данных cucm( IP телефония). только устроился на работу и...

Создать командную строку из RichTextBox для отправки запросов в БД
Добрый вечер! Я хочу организовать командную строку с помощью RichTextBox. При вводе SQL запроса, и нажатии кнопки...

Python потерял библиотеку для отправки произвольный запросов
Вот так примерно выглядела отправка запроса: import somebiblioteka as req res = req.zapros( 'GET / HTTP/1.1', ...

22
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
20.05.2015, 12:04
вариант 1) Смотреть что, когда и зачем отправляет javascript и дублировать в сях
вариант 2) Юзать https://code.google.com/p/v8/ или что-то похожее.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.05.2015, 12:07  [ТС]
Nosey, вообще я подумал а можно свой браузер создать чтобы можно было через него пройти авторизацию. Если получится то типо мб. как то программно сценарий написать.???
От тут вроде как простой браузер создать https://msdn.microsoft.com/ru-... hy332.aspx Но там мб. хз можно ли будет зайти в ВК? мб. он не сможет сделать аутентификацию, такой браузер меня нафиг не устраивает. Как браузер сделать нормальный простой?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
20.05.2015, 12:12
ninja2
По вами приведённому линку, это во-первых работает только под виндой
А-во вторых, там будет скорее всего работать js, это это контролл тупо кусочек ie.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.05.2015, 12:21  [ТС]
Nosey, вообще походу если страницы читаем смысла нету curl использовать, проще фигню эту для ie. Не пробовал сделать, интересно если создать такой браузер и мы загружаем страницу ВК, сможет ли он пройти авторизацию или тем браузером тупо только страницы загружать?
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.05.2015, 12:21
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
#define _CRT_SECURE_NO_WARNINGS
 
#include "wsaErrors.h"
#include <WinSock2.h>
#include <string>
#pragma comment(lib,"WS2_32.lib")
 
const size_t BUFFER_SIZE = 1000000;
 
int main(){
    setlocale(0,"");
    WSAData wsaData;
    SOCKET clientSocket;
    try{
        if( WSAStartup(MAKEWORD(2,0), &wsaData) != 0 ){
            throw SetErrorMessage("STARTUP: ", WSAGetLastError()); 
        }
 
        do{
            if( (clientSocket = socket(AF_INET, SOCK_STREAM, NULL)) == SOCKET_ERROR ){
                throw SetErrorMessage("SOCKET: ", WSAGetLastError());
            }
 
            char url[255];
            char path[128];
            char name[128];
 
            strcpy(path,"\0");
 
            std::cout << "URL: "; std::cin >> url;
 
            for(int i = 0; url[i-1]!='\0'; i++){
                if( url[i] == '/' || url[i] == '\0' ){
                    name[i] = '\0';
                    for(int j = i+1; url[j-1]!='\0'; j++){
                        path[j-i-1] = url[j];
                    }
                    break;
                } else {
                    name[i] = url[i];
                }
            }
 
            std::cout << name << std::endl;
            std::cout << path << std::endl;
 
            hostent *host = gethostbyname(name);
 
            if( host == NULL ){
                std::cout << "HOST NOT FOUND" << std::endl;
                continue;
            }
 
            SOCKADDR_IN server;
            server.sin_family = PF_INET;
            server.sin_port = htons(80);
            server.sin_addr = *((LPIN_ADDR)*host->h_addr_list);;
 
            std::cout << inet_ntoa(server.sin_addr) << std::endl;
 
            try{
                if( connect(clientSocket, (sockaddr *)&server, sizeof(server)) == SOCKET_ERROR ){
                    throw SetErrorMessage("CONNECT: ", WSAGetLastError());
                }   
                std::string request;
                request = "GET /"; 
                request += path; 
                request += " HTTP/1.0\r\nHost: ";
                request += name;
                request += "\r\n";
                request += "User-agent: MEGA BROWSER v0.0\r\n";
                request += "Connection: close";
                request += "\r\n\r\n";
                
                std::cout << request << std::endl;
 
                send(clientSocket, request.data(), strlen(request.data()),NULL);
 
                char *response = new char[BUFFER_SIZE];
                strcpy(response,"");
 
                int rec = 0;
                wchar_t u[255];
                swprintf(u, L"%S%S", name,".html");
                HANDLE file = CreateFile(u, GENERIC_WRITE, 0,0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
                do{
                    rec = recv(clientSocket, response, sizeof(char) * BUFFER_SIZE, 0);
                    response[rec] = '\0';
                    std::cout << response;
                    DWORD nBytes;
                    WriteFile(file, response, rec, &nBytes, NULL); 
                }while( rec > 0 && rec != SOCKET_ERROR );
                CloseHandle(file);
                
                HKEY hKey;
                LPCWSTR lpSubKey = L"http\\shell\\open\\command";
                RegOpenKeyEx(HKEY_CLASSES_ROOT,lpSubKey,0L,KEY_ALL_ACCESS, &hKey);
                DWORD dwSize = 256;
                wchar_t HTMLPath[256];
                RegQueryValueEx(hKey, NULL, NULL, NULL, (LPBYTE)HTMLPath, &dwSize);
 
                //HTMLPath[0] = ' ';
                for(int i = 0; HTMLPath[i] != '\0'; i++){
                    HTMLPath[i] = HTMLPath[i+1];
                    if( HTMLPath[i] == '"'){
                        HTMLPath[i] = '\0';
                        break;
                    }
                }
 
                wcscat(HTMLPath,L" ");
                wchar_t *tcCurrentPath = new wchar_t[FILENAME_MAX/2],
                      *cCurrentPath = new wchar_t[FILENAME_MAX];
                GetCurrentDirectory(FILENAME_MAX, tcCurrentPath);
                wcscat(tcCurrentPath, L"\\");
                wcscat(tcCurrentPath, u);
 
                wcscpy(cCurrentPath, L"-url ");
                wcscat(cCurrentPath, tcCurrentPath);
 
                STARTUPINFO cif = {sizeof(cif)}; 
                PROCESS_INFORMATION pi;
                //std::cout << HTMLPath << std::endl;
                if(!CreateProcessW(HTMLPath, cCurrentPath,NULL,NULL,FALSE,0,NULL,NULL,&cif,&pi )){
                    std::cout << "Ошибка открытия файла " << std::endl;
                }
 
                if( closesocket(clientSocket) == SOCKET_ERROR ){
                    throw SetErrorMessage("CONNECT: ", WSAGetLastError());
                }
            } catch( std::string errorMsgText ){
                std::cout << errorMsgText << std::endl;
            }
        } while( true );
        
    }catch( std::string errorMessageText ){
        std::cout << errorMessageText << std::endl;
    }
 
    WSACleanup();
}
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 <Winsock2.h>
#include <winsock.h>
#include <iostream>
#include <string>
 
std::string GetErrorMsgText(int code){
    std::string msgText;
 
    switch( code ){
        case WSAEINTR:{ msgText = "Работа функции прервана"; break; };
        case WSAEACCES:{ msgText = "Разрешение отвергнуто"; break; };
        case WSAEFAULT:{ msgText = "Ошибочный адрес"; break; };
        case WSAEINVAL:{ msgText = "Ошибка в аргументе "; break; };
        case WSAEMFILE:{ msgText = "Слишком много файлов открыто"; break; };
        case WSAEWOULDBLOCK:{ msgText = "Ресурс временно недоступен"; break; };
        case WSAEINPROGRESS:{ msgText = "Операция в процессе развития"; break; };
        case WSAEALREADY:{ msgText = "Операция уже выполняется"; break; };
        case WSAENOTSOCK:{ msgText = "Сокет задан неправильно"; break; };
        case WSAEDESTADDRREQ:{ msgText = "Требуется адрес расположения"; break; };
        case WSAEMSGSIZE:{ msgText = "Сообщение слишком длинное"; break; };
        case WSAEPROTOTYPE:{ msgText = "Неправильный тип протокола для сокета"; break; };
        case WSAENOPROTOOPT:{ msgText = "Ошибка в опции протокола"; break; };
        case WSAEPROTONOSUPPORT:{ msgText = "Протокол не поддерживается"; break; };
        case WSAESOCKTNOSUPPORT:{ msgText = "Тип сокета не поддерживается"; break; };
        case WSAEOPNOTSUPP:{ msgText = "Операция не поддерживается"; break; };
        case WSAEPFNOSUPPORT:{ msgText = "Тип протоколов не поддерживается"; break; };
        case WSAEAFNOSUPPORT:{ msgText = "Тип адресов не поддерживается протоколом"; break; };
        case WSAEADDRINUSE:{ msgText = "Адрес уже используется"; break; };
        case WSAEADDRNOTAVAIL:{ msgText = "Запрошенный адрес не может быть использован"; break; };
        case WSAENETDOWN:{ msgText = "Сеть отключена"; break; };
        case WSAENETUNREACH :{ msgText = "Сеть не достижима"; break; };
        case WSAENETRESET:{ msgText = "Сеть разорвала соединение"; break; };
        case WSAECONNABORTED:{ msgText = "Программный отказ связи"; break; };
        case WSAECONNRESET:{ msgText = "Связь восстановлена( Соединение было прервано )"; break; };
        case WSAENOBUFS:{ msgText = "Не хватает памяти для буферов"; break; };
        case WSAEISCONN:{ msgText = "Сокет уже подключен"; break; };
        case WSAENOTCONN:{ msgText = "Сокет не подключен"; break; };
        case WSAESHUTDOWN:{ msgText = "Нельзя выполнить send: сокет завершил работу"; break; };
        case WSAETIMEDOUT:{ msgText = "Закончился отведенный интервал  времени"; break; };
        case WSAECONNREFUSED:{ msgText = "Соединение отклонено "; break; };
        case WSAEHOSTDOWN:{ msgText = "Хост в неработоспособном состоянии"; break; };
        case WSAEHOSTUNREACH:{ msgText = "Нет маршрута для хоста"; break; };
        case WSAEPROCLIM:{ msgText = "Слишком много процессов"; break; };
        case WSASYSNOTREADY:{ msgText = "Сеть не доступна"; break; };
        case WSAVERNOTSUPPORTED:{ msgText = "Данная версия недоступна"; break; };
        case WSANOTINITIALISED:{ msgText = "Не выполнена инициализация WS2_32.DLL"; break; };
        case WSAEDISCON:{ msgText = "Выполняется отключение"; break; };
        case WSATYPE_NOT_FOUND:{ msgText = "Класс не найден"; break; };
        case WSAHOST_NOT_FOUND:{ msgText = "Хост не найден"; break; };
        case WSATRY_AGAIN:{ msgText = "Неавторизированный хост не найден"; break; }; 
        case WSANO_RECOVERY:{ msgText = "Неопределенная  ошибка"; break; };
        case WSANO_DATA:{ msgText = "Нет записи запрошенного типа"; break; };
        case WSA_INVALID_HANDLE:{ msgText = "Указанный дескриптор события  с ошибкой"; break; };   
        case WSA_INVALID_PARAMETER:{ msgText = "Один или более параметров с ошибкой"; break; };
        case WSA_IO_INCOMPLETE:{ msgText = "Объект ввода-вывода не в сигнальном состоянии"; break; };
        case WSA_IO_PENDING:{ msgText = "Операция завершится позже"; break; };
        case WSA_NOT_ENOUGH_MEMORY:{ msgText = "Не достаточно памяти"; break; };
        case WSA_OPERATION_ABORTED:{ msgText = "Операция отвергнута"; break; };
        //case WSAINVALIDPROCTABLE:{ msgText = "Ошибочный сервис"; break; };
        //case WSAINVALIDPROVIDER:{ msgText = "Ошибка в версии сервиса"; break; };
        //case WSAPROVIDERFAILEDINIT:{ msgText = "Невозможно инициализировать сервис"; break; }; 
        case WSASYSCALLFAILURE:{ msgText = "Аварийное завершение системного вызова"; break; };
        default:{ msgText = "error: " + code; break; };
    };
    return msgText;
};
 
std::string SetErrorMessage(std::string msgText, int code){
    return msgText + GetErrorMsgText(code);
};
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.05.2015, 12:32  [ТС]
UnsKneD, это наверно не то, ты вместо curl вроде типо на сокетах сделал и получил в ответ страницу, ну оно ж js код не сможет выполнить. А если не сможет выполнить то и сымитировать действия пользователя не сможет (мою функцию js добавить к коду и вызвать).
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
20.05.2015, 12:38
Цитата Сообщение от ninja2 Посмотреть сообщение
Nosey, вообще походу если страницы читаем смысла нету curl использовать, проще фигню эту для ie. Не пробовал сделать, интересно если создать такой браузер и мы загружаем страницу ВК, сможет ли он пройти авторизацию или тем браузером тупо только страницы загружать?
Я далеко не знаток этой штуковины, но и мне кажется что она не позвоит влазить в страницу приличным образом.
Т.е. всё-таки придётся v8 юзать.
Но я не знаю этого, посмотрите, ну либо кто-то поумнее сюда подойдёт
1
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.05.2015, 12:42
ninja2, нет конечно, тут нужно будет парсер ещё сделать, вытащить функцию из js, транслировать её в Cи и уже потом выполнить.

Добавлено через 2 минуты
Возьмите готовый движок, Chromium например.
1
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
20.05.2015, 12:47
1. можно заюзать хромиум. исходники доступны.
2. заюзать существующий браузер с плагином к нему.
В частности хром, написать к нему расширение, которое будет в браузере делать то, что вам надо. Если при этом
чать функционала надо выполнять в скажем плюсах - то в плюсовом процессе реализуется http сервер, с которым расширение хрома вполне себе может общаться.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.05.2015, 13:02  [ТС]
Цитата Сообщение от UnsKneD Посмотреть сообщение
нет конечно, тут нужно будет парсер ещё сделать, вытащить функцию из js, транслировать её в Cи и уже потом выполнить.
Та нет такое не годится, нужно чтобы выполнялись все функции javaScript автоматом как в браузере.
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.05.2015, 17:07
ninja2, тогда хромиум
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.05.2015, 20:53  [ТС]
UnsKneD, Погуглю попробую, у меня мб. его и установить не получится и подключить к VS , когда то вроде пробовал или вебкит уже не помню что невыходило ниче.
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
20.05.2015, 22:25
ихмо написать расширение все-таки по проще будет. по крайней мере химичить с веб пейджой удобнее из js, а не из плюсов.
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
02.06.2015, 10:35  [ТС]
Создал приложение в стиле веббраузера на мфс, загружаю страницу fl.ru или стим и другие, то выводится окно с ошибкой и не правильно подгружаются страницы, как это исправить? Вообще пишет что ИЕ7 используется хотя у меня на компьютере стоит ИЕ11
Миниатюры
Создание эмулятора браузера для отправки запросов  
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
02.06.2015, 18:17
ninja2, ваша проблема описана в первом запросе к гуглу, неужели так сложно?

проблема в запятых в JS коде.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
02.06.2015, 18:36
Цитата Сообщение от ninja2 Посмотреть сообщение
Вообще пишет что ИЕ7 используется хотя у меня на компьютере стоит ИЕ11
Так оно и есть, используется старая версия ослика. И это хорошо, иначе бы пришлось с каждым апдейтом ие, обновлять и ваше приложение, чтобы оно "рисовалось" нормально.
Если желаете что-то современное - то это хромиум.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
02.06.2015, 19:35
Цитата Сообщение от ninja2 Посмотреть сообщение
чтобы как реальный браузер
Реальный броузер и использовать. IE доступен как COM. Довольно муторно, правда :-)

ExecJS() example
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
void CMail_checkerDlg::ExecJS()
{
   IHTMLDocument2*      pDoc = NULL;
 
   if (SUCCEEDED(m_Browser.GetDocument()->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)) && pDoc)
   {
      //Getting IDispatch for Java Script objects
      IDispatch*     pScript = NULL;
 
      if (SUCCEEDED(pDoc->get_Script(&pScript)) && pScript)
      {
         // Find dispid for given function in the object
         DISPID      NameID     = 0;
         UINT        uiNamesCnt = 1;
 
         CString     sFunc(JS_FUNC_NAME);
         CComBSTR    bsFunc(sFunc);
 
         if (SUCCEEDED(pScript->GetIDsOfNames(IID_NULL,&bsFunc,uiNamesCnt,LOCALE_SYSTEM_DEFAULT,&NameID)) && NameID)
         {
            DISPPARAMS     Params;
            
            memset(&Params,0,sizeof(Params));
 
            EXCEPINFO      ExInfo;
 
            memset(&ExInfo,0,sizeof(ExInfo));
 
            CComVariant    vResult;
 
            UINT           uiArgErr = (UINT)-1;  // Initialize to invalid arg
 
            //Call JavaScript function         
            if (SUCCEEDED(pScript->Invoke(NameID,IID_NULL,0,DISPATCH_METHOD,&Params,&vResult,&ExInfo,&uiArgErr)))
            {
               ; // Do Nothing !                  
            }
         }
      }
 
      pScript->Release();
      pScript = NULL;
   }
   
   pDoc->Release();
   pDoc = NULL;
      
   #ifdef _DEBUG
   IHTMLDocument2*      pDBG_Doc = NULL;
   
   if (SUCCEEDED(m_Browser.GetDocument()->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDBG_Doc)) && pDBG_Doc)
   {
      IHTMLDocument2*      pDoc2 = NULL;
 
      if (SUCCEEDED(pDBG_Doc->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc2)) && pDoc2)
      {
         IHTMLElement*     pBody = NULL;
 
         if (SUCCEEDED(pDoc2->get_body(&pBody)) && pBody)
         {
            CComBSTR       bsHtml;
 
            if (SUCCEEDED(pBody->get_innerHTML(&bsHtml)) && bsHtml)
            {
               CString     sHtml = bsHtml;
 
               DumpHtml((LPCTSTR)sHtml,sHtml.GetLength());
            }
         }
 
         pBody->Release();
         pBody = NULL;
      }
 
      pDoc2->Release();
      pDoc2 = NULL;
   }
 
   pDBG_Doc->Release();
   pDBG_Doc = NULL;
   #endif
}

Не по теме:

Я на нем делал и авторизацию в Gmail и парсеры AJAX-сайтов.

1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.06.2015, 00:10  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Реальный броузер и использовать. IE доступен как COM. Довольно муторно, правда :-)
Ничего не понял. Что нужно использовать IE как COM? А что такое COM я не знаю и как его использовать тоже
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
11.06.2015, 00:29
о, опять эта тема всплыла. вы вариант с расширенями к хрому рассматривали?
с ними сильно проще если это не какое-то решение для продакшена.
по долгу службы приходится заниматься похожей задачей и могу сказать,
что из расширения с страницами работать сильно проще, чем из плюсового кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2015, 00:29
Помогаю со студенческими работами здесь

Программа для отправки GET запросов работает только в отладочном режиме
Программа должна отправлять запросы по указанной ссылке , можно указать период отправок и кол-во повторений. При билдинге (F5) и запуске...

Создание запросов для БД
Всем привет! Ниже скину бд &quot;Гостиница&quot; там я вставил свои значения и кое-что отредактировал. Нужно создать на основе этих таблиц сложные...

Создание пакетов для отправки в COM port
Начал программировать на С++ совсем недавно и вот столкнулся с такой проблемой: Нужно отправить в порт файл по частям. Описываю char...

Очередь отправки get-запросов
Есть get запрос: http://158.4581/sad.php?id=&amp;auth= И есть содержимое в richTextBox1 такого типа: ...

Цикл отправки GET запросов
Отправляю в цикле GET запрос (send) и получаю ответ (recv). Первая итерация проходит успешно. А на второй в ответ ничего не приходит (recv...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru