Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,400
Записей в блоге: 6

Размер ехе-шника. Опции компилятора и линкера

04.09.2009, 15:08. Показов 3835. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, господа программисты!!
Переписываю свой скринсайвер на С++ с оптимизацией
был на Delphi без оптимайза (http://narod.ru/disk/123465980... m.scr.html)

Но при построении релиза размер ЕХЕ, по-моему, слишком велик - 152Кб. Из них 64кб-ресурсы. На делфи занимал 108кб.
Использую следующие опции компилятора:
/Ox /GL /I "\3D" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /arch:SSE /fp:fast /Fo"Release\\" /Fd"Release\vc80.pdb" /W1 /nologo /c /TP /errorReportrompt
опции линкера:
/OUT:"D:\MyProgs\VS2005\Directed Stream\Release\Directed Stream.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\Directed Stream.exe.intermediate.manifest" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT opengl32.lib glu32.lib winmm.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Как ещё можно сжать ехе шник по-мимо использования упаковщиков типа UPX, ASPack?
Есть ли ещё какие либо опции для уменьшения размера?

Если использовать Multi-threaded DLL (/MD) вместо Multi-threaded (/MT) то код уменьшается аж до 96Кб, но тогда используется ДЛЛ без которой наверно не запустится.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2009, 15:08
Ответы с готовыми решениями:

Опции компилятора
Скажите пожалуйста, как можно проверить опции компилятора (с помощью макросов). Какие опции нужно проверять? Компилятор visual studio....

Опции компилятора Gw/Gy
Может кто разъяснит на, что конкретно влияют опции компилятора Gw и Gy, когда их устанавливаешь одновременно обе то почему-то ниже...

Большой размер exe-шника
Делаю форму и кнопку на форме средствами MFC. Когда создаю exe-шник то он весит примерно 1,3 метра! Это же оч много=) На том же Борленде...

8
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
04.09.2009, 16:00
Цитата Сообщение от snake32 Посмотреть сообщение
odbc32.lib odbccp32.lib
явно не нужны
1
 Аватар для @err,hr
0 / 0 / 0
Регистрация: 05.09.2009
Сообщений: 6
05.09.2009, 21:04
Можно stub свой написать.
Насколько я помню, в 4 байта ее можно ужать.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
06.09.2009, 02:01
Вот трюк, которым пользуюсь уже давно.

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
#include <windows.h>
 
//#define APP_TINY
 
#ifdef APP_TINY
// переопределям точку входа на My_WinMain
// если установлена соответствующая деректива компилятора
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:My_WinMain")
#pragma comment(linker,"/NODEFAULTLIB")
#endif
 
#ifdef APP_TINY
void My_WinMain (void) {
#else
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
#endif
 
  // TO DO: здесь код твоей WinMain
  MessageBox(NULL, "Hello, world!", "Yaaaaa!", MB_OK | MB_ICONINFORMATION);
 
#ifdef APP_TINY
    ExitProcess(0);
#else
    return 0;
#endif
}
1. Создай новый пустой Win32 проект.
2. Добавь в него этот файл.
3. Установи активную конфигурацию - Release.
4. Откомпилируй и посмотри размер.
5. Раcкомментируй строку №3 (#define APP_TINY)
6. Откомпилируй и посмотри размер.

У меня: на 4 шаге получилось 24 Кб, а на 6 - 2 Кб!!!
Или реальный пример. Моя последняя программа с отключенным APP_TINY получилась размером 396 Кб, после включения и перекомпиляции уже 120 Кб. Как тебе?
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,400
Записей в блоге: 6
06.09.2009, 21:05  [ТС]
@err,hr, что такое stub?
polivets, ОГО! Обязательно проверю. Благодарю!

Добавлено через 1 час 27 минут
polivets, попробывал код на своей программе - не вышло требует какую-то либку наверно
Linking...
mainwindow.obj : warning LNK4229: invalid directive '/FILEALIGN:512' encountered; ignored
mainwindow.obj : warning LNK4229: invalid directive '/IGNORE:4078' encountered; ignored
global.obj : error LNK2001: unresolved external symbol @__security_check_cookie@4
global.obj : error LNK2001: unresolved external symbol _rand
GLObjects.obj : error LNK2001: unresolved external symbol "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)
GLObjects.obj : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)
mainwindow.obj : error LNK2001: unresolved external symbol __wtoi
mainwindow.obj : error LNK2001: unresolved external symbol __itow
D:\Programer\Visual Studio 2005\Directed Stream\ssDirected_Stream\Release\ssDirec ted_Stream.exe : fatal error LNK1120: 6 unresolved externals


Добавлено через 1 минуту
Что посоветуете?

Добавлено через 11 минут
Добавил MSVCRT.LIB теперь вылезает это:
fatal error LNK1137: invalid argument '.text,EWRX' specified with /SECTION
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
06.09.2009, 21:30
snake32,
polivets, попробывал код на своей программе - не вышло требует какую-то либку наверно
потому что этот код -это для программы уровня HelloWorld
как видишь, оттуда даже выйти по-нормальному нельзя, а только через ExitProcess
отказ от точки входа по-умолчанию означает что стандартные функции тебе скорее всего будут недоступны.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
06.09.2009, 22:18
Цитата Сообщение от Rififi Посмотреть сообщение
по-умолчанию означает что стандартные функции тебе скорее всего будут недоступны
Недоступными становятся функции из CRuntimeLibrary, подефолту, прилинковывающиеся, к каждому еxe, вне зависимости от того узаешь ты функции от туда или нет. При чем, линкуется вся библиотека скопом, а не только, те функции, которые вызываются из твоей проги. Если все же, какие-то функции из нее понадобятся, то к проекту нужно добавить MSVCRT.lib.

Недостатком является, то что становяться недоступными переменные, передающиеся в WinMain из стуба, но это очень просто обоити используя соответсвующие API функции.
C++
1
2
3
4
5
6
7
int WINAPI WinMain(
 
    HINSTANCE hInstance,    // handle to current instance
    HINSTANCE hPrevInstance,    // handle to previous instance
    LPSTR lpCmdLine,    // pointer to command line
    int nCmdShow    // show state of window
   );
Code
1
2
3
4
1 - GetModuleHandle(NULL);
2 - не используется
3 - GetCommandLine();
4 - GetStartupInfo(LPSTARTUPINFO lpStartupInfo);
snake32, приаттач свой WinMain, посмотрим что не так и какая у тебя версия VS?
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,400
Записей в блоге: 6
07.09.2009, 01:24  [ТС]
polivets, у меня VS 2005.
Вот собственно код с WinMain'ом. Без #define APP_TINY компилится нормально.
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#include "global.h"
#include "mainGL.h"
#include <mmsystem.h>
#include <commctrl.h>
 
#define APP_TINY
 
#ifdef APP_TINY
// переопределям точку входа на My_WinMain
// если установлена соответствующая деректива компилятора
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512")
#pragma comment(linker,"/SECTION:.text,EWRX")// /IGNORE:4078")
#pragma comment(linker,"/ENTRY:TinyWinMain")
#pragma comment(linker,"/NODEFAULTLIB")
#endif
 
static TCHAR *szClassName = _TEXT("S32DirectedStream");
static TCHAR *szWindowName = _TEXT("Directed Stream");
static TCHAR *szMutexName = _TEXT("S32MutexRunOnceApp");
static HINSTANCE hInst = 0;
static HANDLE hMutex = NULL;
static BOOL fIsPreview = FALSE;
#define MOUSE_COUNTER (32)
static int nMouseCounter = MOUSE_COUNTER;
 
static mainGL *pGL = NULL;
 
typedef DWORD (WINAPI* pfnPwdChangePassword)( LPCTSTR, HWND, DWORD, PVOID );
typedef BOOL (WINAPI* pfnVSSPwd)( HWND );
 
#ifdef UNICODE
#define FNCNAMEPCP "PwdChangePasswordW"
#else
#define FNCNAMEPCP "PwdChangePasswordA"
#endif
 
#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
 
 
 
int GetRunType( const LPTSTR str, HWND* param )
{
    int pos = -1;
    for(int i=0; i<(int)_tcslen( str ); i++ )
        if( str[i] == _T('-')|| str[i] == _T('/') )
        {
            pos = i;
            break;
        };
    if( pos == -1 || (int)_tcslen( str ) < pos+2 )
        return RT_FULLSCR;
    switch ( str[ pos + 1 ] )
    {
    case _T('p'):
    case _T('P'):
        *param = (HWND)_tstoi( str + pos + 2 );
        return RT_PREVIEW;
    case _T('c'):
    case _T('C'):
        return RT_SETUPS;
    case _T('a'):
    case _T('A'):
        *param = (HWND)_tstoi( str + pos + 2 );
        return RT_PASSWORD;
    default:
        return RT_FULLSCR;
    };
}
 
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
 
WPARAM CreateScrSaverWindow( HWND hParent );
#ifdef APP_TINY
void TinyWinMain (void)
#else
int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
#endif
{
    hInst = GetModuleHandle( NULL );
    hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, szMutexName );
    if( hMutex )
    {
        g_hMainWnd = FindWindow( szClassName, szWindowName );
        if( g_hMainWnd )
        {
            CloseHandle( hMutex );
            SendMessage( g_hMainWnd, WM_CLOSE, 0, 0 );
            g_hMainWnd = NULL;
        };
    };
 
    hMutex = CreateMutex( NULL, FALSE, szMutexName );
 
    HWND param = NULL;
    LoadSettings();
#ifdef APP_TINY
    TCHAR lpCmdLine[MAX_PATH] = {0};
#endif
    switch ( GetRunType( lpCmdLine, &param ) )
    {
    case RT_SETUPS:
        {
        /*INITCOMMONCONTROLSEX icc = { sizeof( icc ), ICC_STANDARD_CLASSES };
        InitCommonControlsEx( &icc );
        //CreateDialog( NULL, MAKEINTRESOURCE( IDD_SETUP ), NULL, (DLGPROC)SetupDlgProc ) ;*/
 
        if( DialogBox( hInst, MAKEINTRESOURCE( IDD_SETUP ), NULL, (DLGPROC)SetupDlgProc ) == IDOK )
            SaveSettings();
        }
        break;
    case RT_PASSWORD:
        RunSetPassword( param );
        break;
    case RT_FULLSCR:
    case RT_PREVIEW:
        {
            if( g_flCameraRot )
            {
                fOffsetZ = 0.0f;
                nAbsRangeX = 16;
                nAbsRangeZ = 16;
                CLIP_BOTTOM = -55.0f;
                STRT_TOP = 55.0f;
            }
            CreateScrSaverWindow( param );
        }
    };
#ifdef APP_TINY
    ExitProcess( 0 );
#else
    return 0L;
#endif
}
 
WPARAM CreateScrSaverWindow( HWND hParent )
{
    RECT rect; 
    DWORD dwWSflag = WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
    DWORD dwThreadId = GetCurrentThreadId();
    HWND hForeground = GetForegroundWindow();
    UINT style =  CS_VREDRAW | CS_HREDRAW |CS_OWNDC;
    fIsPreview = (BOOL)hParent;
    if( hParent )
    {
        GetWindowRect( hParent, &rect ); 
        dwWSflag |= WS_DISABLED | WS_CHILD;
    }else
    {
        dwWSflag |= WS_POPUP;
        GetWindowRect( GetDesktopWindow(), &rect );
    };
    rect.right -= rect.left;
    rect.bottom -= rect.top;
 
    WNDCLASSEX wc;
    MSG msg;
    ZeroMemory( &wc, sizeof( wc ) );
    ZeroMemory( &msg, sizeof( msg ));
    wc.cbSize = sizeof( wc );
    wc.style = style;
    wc.lpszClassName = szClassName;
    wc.hInstance = hInst;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
 
    if( ! RegisterClassEx( &wc ) )
    {           
        CloseHandle( hMutex );
        return FALSE;
    };
    timeBeginPeriod( 1 );
    DWORD dwLastTick = timeGetTime();
 
    g_hMainWnd = CreateWindowEx( /*WS_EX_TOPMOST*/NULL, szClassName, szWindowName, dwWSflag, //WS_OVERLAPPEDWINDOW,
        0, 0, rect.right ,rect.bottom,
        hParent, NULL, hInst, NULL );
    if( ! g_hMainWnd )
    {
        CloseHandle( hMutex );
        return FALSE;
    };
    if( !hParent )
    {
        ShowCursor( FALSE );
        SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, (PVOID)(&dwThreadId), 0 );
        ShowWindow( g_hMainWnd, SW_SHOW );
        UpdateWindow( g_hMainWnd );
    };
 
    while ( msg.message != WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }else
        {
            
            DWORD dwCurrentTick = timeGetTime();
            pGL->UpdateAndRender( (float)(dwCurrentTick - dwLastTick) );
#ifdef _DEBUG
            static float fps = 0.0f;
            static DWORD dwLast = 0;
            static DWORD dwCountFrames = 0;
            dwCountFrames++;
            if( dwCurrentTick - dwLast > 1000 )
            {
                static int  decimal, sign;
                fps = (float)dwCountFrames;
                
                static char caption[MAX_PATH];
                _gcvt( fps, 8, caption );
                SetWindowTextA( g_hMainWnd, caption );
                dwCountFrames = 0;
                dwLast = dwCurrentTick;
            };
#endif
            dwLastTick = dwCurrentTick;
        }
    };
    if( !hParent )
    {
        SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, &dwThreadId, 0 );
        ShowCursor( TRUE );
        SetForegroundWindow( hForeground );
    };
    timeEndPeriod( 1 );
    UnregisterClass( szClassName, hInst );
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_SIZE:
        pGL->Resize( LOWORD(lParam), HIWORD(lParam) );
        break;
    case WM_CREATE: 
        pGL = new mainGL( hWnd );
        SetTimer( hWnd, 1, 7000, NULL );
        
        break;
    case WM_DESTROY:
        delete pGL;
        KillTimer( hWnd, 1 );
        CloseHandle( hMutex );
        PostQuitMessage( 0 );
        break;
    case WM_TIMER:
        BYTE R,G,B;
        do{
            R = Random( 224 )+32;
            G = Random( 224 )+32;
            B = Random( 224 )+32;
        }while( (R+G+B) < 300 );
        InterlockedExchange( (long*)&g_dwColorChains, ( B << 16) | ( G << 8 ) | R  );
        break;
    case WM_KEYDOWN: 
    case WM_LBUTTONDOWN:
    case WM_MBUTTONDOWN:
    case WM_RBUTTONDOWN:
        if( AskPassword() )
                    PostMessage( g_hMainWnd, WM_CLOSE, 0,0 );
        break;
    case WM_MOUSEMOVE:
        if( !fIsPreview )
            if( --nMouseCounter <= 0 )
                if( AskPassword() )
                    PostMessage( g_hMainWnd, WM_CLOSE, 0,0 );
        break;
    default:
        return ( DefWindowProc( hWnd, message, wParam, lParam ) );
    };
    return 0L;
}
...
Если это поможет могу выкинуть ссылку на весь готовый проект в архиве(~2Mb)

Не по теме:

А вообще оптимизация на таком уровне даже завораживает :jokingly:

0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,400
Записей в блоге: 6
07.09.2009, 12:04  [ТС]
Пытаюсь разобраться с опциями линкера. Нашёл и прочитал статью про CRT:
http://www.rsdn.ru/article/cpp/crt.xml
Кое-что прояснилось, но всё равно пока не понял до конца
В программе активно использую ООП, т.е. классы с конструкторами и деструкторами, если new и delete можно заменить, то что делать с классами?
#pragma comment(linker,"/MERGE:.rdata=.text") - вообще для меня пока секрет.
Объединяются сегменты данных(.rdata - судя по названию, это сегмент данных только для чтения, те там хранятся константы? или что?) и текст(это вообще не понял. что в нем обычно содержится? и Зачем он нужен?)
Где можно почитать про эти секции?( желательно на русском ).

ASM знаю на малом уровне. (пытался программить на TASM консольные приложения, где из секций были .code и .data)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2009, 12:04
Помогаю со студенческими работами здесь

Уменьшить размер ехе-шника (Delphi XE)
Написал программу, скомпилил в Delphi 7 - 500КБ. Скомпилил такой же код в Delphi XE - 1,5МБ. Мягко говоря, неприятно удивляет такое...

AVRStudio – таблица прерываний - опции линкера
Доброго времени суток коллеги! Как известно при компиляции проекта в первых адресах FLASH находится таблица прерываний. Какой опцией...

Де компиляция ехе"шника
Добрый день. Хотел бы спросить, имеется программа для тестирования написанная на Делфи с расширением exe (т.е установочный вариант) и к ним...

Извлечь иконку с ехе-шника
по-моему все перепутал =) подскажите пож, как правильно ... HMODULE hLib; void __fastcall TForm1::FormCreate(TObject *Sender) {...

Запуск ехе-шника на чистой машине
Написано приложение обработки БД Access, использован DAO. Что нужно поставить на чистую машину (библиотеки, компоненты,...), чтобы это...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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