Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/62: Рейтинг темы: голосов - 62, средняя оценка - 4.95
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

OLE(Object Linking and Embedding)?

24.01.2024, 23:07. Показов 14647. Ответов 167

Здравствуйте! Приступил к изучению темы OLE, если кто-то эту тему понимает, то ему не составит труда пояснить что это за зверь такой, ну, или пояснить некоторые моменты, мелочи. Вот одна такая "мелочь"
Почему автор объявляет класс так:
Кликните здесь для просмотра всего текста
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
#ifndef IMALLOC_H
#define IMALLOC_H
 
/*==================================================================
    IMALLOC.H
    C Interface to private allocator
======================================================================*/
#define EXPORT extern "C" __declspec(dllexport)
 
EXPORT LPMALLOC CreateAllocator();
 
//----------------------------------------------
//Implementation of allocator interface
//------------------------------------------------------------------------
#undef INTERFACE 
#define INTERFACE DAlloc 
 
DECLARE_INTERFACE_(DAlloc, IMalloc)
{
    // *** IUnknown methods ***
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppv);
    STDMETHOD_(ULONG, AddRef)(THIS);
    STDMETHOD_(ULONG, Release)(THIS);
 
    // *** IMalloc methods ***
    STDMETHOD_(void*, Alloc)(THIS_ ULONG cb);
    STDMETHOD_(void*, Realloc)(THIS_ void* pv, ULONG cb);
    STDMETHOD_(void, Free)(THIS_ void* pv);
    STDMETHOD_(size_t, GetSize)(THIS_ void* pv);
    STDMETHOD_(int, DidAlloc)(THIS_ void* pv);
    STDMETHOD_(void, HeapMinimize)(THIS);
 
#ifndef CINTERFACE 
public:
    DAlloc();
    ~DAlloc();
    BOOL Initialize();
 
private:
    ULONG RefCount;
    HANDLE hHeap;
#endif
 
};
 
 
#endif

Это что-то абсолютно мне не знакомое, и, если на win32 DLL-библиотека собирается, то для win64 уже нет, ругается
Code
1
2
3
4
5
imalloc.cpp(15): error C2259: "DAlloc": невозможно создать экземпляр абстрактного класса
imalloc.h(19): message : см. объявление "DAlloc"
imalloc.cpp(15): message : из-за следующих членов:
imalloc.cpp(15): message : void *IMalloc::Alloc(SIZE_T): абстрактный
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\objidlbase.h(1151): message : см. объявление "IMalloc::Alloc"
Но почему эти ошибки не касаются win32 библиотеки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2024, 23:07
Ответы с готовыми решениями:

Error linking glsl Program Object
Здравствуйте уважаемые гуру. Устроился на работу, дали проект, проект компилится, собирается но проблемма такая: на некоторых компьютерах...

Как увидеть содержание типа OLE Object с помощью Delphi-Ole Conteiner?
Привет всем, я из Болгарии у меня такой вопрос: я работю с MSAccess и в ней есть Table и Field с содержанием типа OLE Object. как я...

Изменить Свойство Ole Object
Добрый день. Ткните носом кто-нибудь плз., как программно поменять свойство Display As вставленного в Rich Text поля OLE Object-а типа...

167
29.02.2024, 08:52

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
изучение COM особо не продвигается, так что я даже не знаю что лучше в данном случае
Лучше подумать о целях изучения и из них исходить.

0
01.03.2024, 09:56

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
RegDeleteTree(), например, не поддерживается
а, например, SHDeleteKeyA() ?

0
01.03.2024, 17:13  [ТС]

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
а, например, SHDeleteKeyA() ?
Я её, функцию удаления значения из реестра, уже реализовал, и без SHDeleteKeyA, да не так как хотелось бы в плане универсальности, в плане понятности кода, смешал С и С++, но всё же.

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
03.03.2024, 00:03  [ТС]
Всё равно та же ошибка REGDB_E_CLASSNOTREG хотя значения в реестр добавлены.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
03.03.2024, 07:01
Цитата Сообщение от Liss29 Посмотреть сообщение
хотя значения в реестр добавлены.
Что за двойные \\ ?
В путях используются одинарные \
Исправляйте.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
03.03.2024, 07:18  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Исправляйте.
Уже давно исправил, но толку от этого никакого.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
03.03.2024, 11:41
Liss29, странный ключ, хелп вроде бы говорит, что это устаревший вариант оставленный для совместимости (CLSID Key).
Можно попробовать регистрацию через reg-файл ("myfile.reg").
Файл для регистрации
Code
1
2
3
4
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{01234567-8901-2345-6789-012345678901}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{01234567-8901-2345-6789-012345678901}\InprocServer32]
@="C:\\MyFirstCOM.dll"
Файл для удаления
Code
1
2
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{01234567-8901-2345-6789-012345678901}]
Если у вас старая версия винды, то возможно первая строка с версией должна отличаться. Можно запустить редактор реестра (regedit), посмотреть какие настройки у других COM и сделать аналогично. Из редактора можно экспортировать ветку какого-нибудь COM-а в файл и посмотреть первую строку с версией.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
03.03.2024, 23:48  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Можно попробовать регистрацию через reg-файл ("myfile.reg").
Попробовал. Регистрация прошла успешно, в том плане, что данные были добавлены в реестр, но ошибка осталась прежней.
И да, путь к .DLL, в котором присутствует кириллица в реестре отображается кракозябрами, возможно, в этом проблема.

Не по теме:

Цитата Сообщение от Ygg Посмотреть сообщение
Если у вас старая версия винды, то возможно первая строка с версией должна отличаться.
На 10-ке старая версия regedit-а..., я, в данном случае, запускаю проект на хостовой машине, а на ней стоит windows 10.



Добавлено через 30 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
в котором присутствует кириллица в реестре отображается кракозябрами, возможно, в этом проблема.
Это я исправил путём изменений кодировки .reg-файла на ANSI, но проблема осталась, ошибка никуда не делась.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
04.03.2024, 11:28
Liss29, есть ещё вариант путаницы с 32х и 64х битными компонентами и путями в реестре.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSI D\ в 64х битной ОС используется для 64х битных программ.
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ Classes\CLSID\ в 64х битной ОС используется для 32х битных программ.
Если ваша программа пишет и читает реестр напрямую, то обычно используются короткие пути без WOW6432Node. ОС автоматически добавит этот подраздел в путь если программа 32х битная. Если же вы пользуетесь сторонними программами для редактирования реестра, то тут нужно самому задавать нужные пути.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
04.03.2024, 17:26  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Если ваша программа пишет и читает реестр напрямую
Вчера я добавлял значения в реестр через .reg-файл, это напрямую или нет, хотя пробовал добавлять вручную, но вручную в ветку HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSI D\ добавлять не даёт хз почему, так что только через .reg-файл или через функцию такую как описана у Петзольда.

Ну, можно в .reg-файл добавить ещё один путь.
Code
1
2
3
4
5
6
7
8
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{308D0430-1090-11CF-B92A-00AA006238F8}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{308D0430-1090-11CF-B92A-00AA006238F8}\InprocServer32]
@="D:\\MyFolder\\Документы\\__Projects\\Petzold\\OLE\\CALLPUB\\Debug\\PUBMEM.DLL"
 
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{308D0430-1090-11CF-B92A-00AA006238F8}]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{308D0430-1090-11CF-B92A-00AA006238F8}\InprocServer32]
@="D:\\MyFolder\\Документы\\__Projects\\Petzold\\OLE\\CALLPUB\\Debug\\PUBMEM.DLL"
Цитата Сообщение от Ygg Посмотреть сообщение
Если же вы пользуетесь сторонними программами для редактирования реестра, то тут нужно самому задавать нужные пути.
Вообще стараюсь использовать Reg Organizer для работы с реестром.

Добавлено через 6 минут
Теперь ошибка такая Ошибка в библиотеке DLL и адрес, но в подключённых модулях я DLL-ки не наблюдаю.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
04.03.2024, 18:15
Цитата Сообщение от Liss29 Посмотреть сообщение
Теперь ошибка такая Ошибка в библиотеке DLL и адрес, но в подключённых модулях я DLL-ки не наблюдаю.
Похоже, что у вас прошла 32х битная регистрация. Для начала убедитесь, что библиотека у вас то же 32х битная, как и клиент. Далее как-то нужно всё это отлаживать и искать, что же не работает. Можно попытаться поставить брекпоинт в функцию создания фабрики, что бы убедиться, что она вызывается или в текстовый лог что-нибудь записать вместо брекпоинта. Если фабрика вызывается, то идти отладчиком дальше по пути создания объекта. Если фабрика не вызывается, то возможно проблемы с загрузкой библиотеки (специфичные зависимости от других библиотек) или именами экспортируемых функций (нет нужных функций, не отключили C++ манглинг), можно попытаться загрузить библиотеку ручками через LoadLibrary и запросить у неё указатель на функцию создания фабрики GetProcAddress(module, "DllGetClassObject").
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
04.03.2024, 22:53  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Похоже, что у вас прошла 32х битная регистрация.
Я создаю 32 битное приложение, в студии оно выставлено по умолчанию, так что, видимо да, 32х битная регистрация.

Цитата Сообщение от Ygg Посмотреть сообщение
Для начала убедитесь, что библиотека у вас то же 32х битная, как и клиент.
В студии по умолчанию создаётся х86 приложение и библиотека тоже, а так как я ничего в настройках не менял, то, думаю, что библиотека тоже 32х битная.

Цитата Сообщение от Ygg Посмотреть сообщение
Далее как-то нужно всё это отлаживать и искать, что же не работает. Можно попытаться поставить брекпоинт в функцию создания фабрики
Как будто я не пытался, но ничего не происходит, если использовать отладчик студии, не хочет он почему то останавливаться на точке останова установленной в библиотеке, когда я работаю в клиенте.

Цитата Сообщение от Ygg Посмотреть сообщение
Если фабрика не вызывается, то возможно проблемы с загрузкой библиотеки
Ну, я так думаю, что, если её(библиотеки) нет среди загруженных модулей, то значит она не загружена, значит какие-то проблемы с загрузкой библиотеки есть, но какие, вот в чём вопрос.

Цитата Сообщение от Ygg Посмотреть сообщение
(нет нужных функций, не отключили C++ манглинг)
Отключил.
C++
1
2
3
#define EXPORT extern "C" __declspec (dllexport)
 
EXPORT LPMALLOC CreateAllocator();
Цитата Сообщение от Ygg Посмотреть сообщение
можно попытаться загрузить библиотеку ручками через LoadLibrary и запросить у неё указатель на функцию создания фабрики GetProcAddress(module, "DllGetClassObject").
Может быть и стоит, мне кажется, что, возможно, проблема может быть и здесь, у автора книги проекты собираются через командную строку и для сборки, по моему, клиента он дополнительно прописывает компилятору что-то такое /EXPORT DllGetClassObject, /EXPORT DllCanUnloadNow я же собираю с помощью среды разработки и эти значения я никуда соответственно не прописывал.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
04.03.2024, 23:11
Цитата Сообщение от Liss29 Посмотреть сообщение
Отключил
Вот как раз "CreateAllocator" не должен экспортироваться, если рассматривать строение библиотеки с точки зрения COM. При создании алокатора через CoCreateInstance библиотека должна экспортировать DllGetClassObject и DllCanUnloadNow. Имена этих функций в экспорте не должны содержать дополнительный буковок. Эти две функции являются экспортируемым минимумом, без которого COM работать не будет.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
04.03.2024, 23:42  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Вот как раз "CreateAllocator" не должен экспортироваться, если рассматривать строение библиотеки с точки зрения COM.
Ну хорошо убрал я EXPORT с CreateAllocator поставил его к DllGetClassObject и DllCanUnloadNow, результат, ошибка:
error C2375: DllGetClassObject: переопределение; другое связывание
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\combasea pi.h(1434): message : см. объявление "DllGetClassObject"
error C2375: DllCanUnloadNow: переопределение; другое связывание
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\combasea pi.h(1437): message : см. объявление "DllCanUnloadNow"
Не нравится ему что-то, что я переопределяю понять не могу.

Цитата Сообщение от Ygg Посмотреть сообщение
Вот как раз "CreateAllocator" не должен экспортироваться, если рассматривать строение библиотеки с точки зрения COM.
Почему? Должен импортироваться или вообще оставить так как есть, пусть имя функции CreateAllocator манглируется.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
05.03.2024, 06:40  [ТС]
В общем я в командную строку Linker-а добавил следующие параметры /EXPORT: DllGetClassObject /EXPORT: DllCanUnloadNow получил предупреждения экспорт символа "DllGetClassObject" должен быть PRIVATE, но проект собрался. Далее в клиенте я сам подгрузил DLL-ку, получил указатель на эту функцию, вызвал её и получил вот что в
функции DllGetClassObject Вызвано исключение: нарушение доступа для чтения. pClassFactory->**** было 0xCDCDCDCD..
Опять память не выделяется для vtbl...
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
05.03.2024, 07:27
Liss29, дайте лучше файлы библиотеки и клиента.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.03.2024, 09:05
Цитата Сообщение от Liss29 Посмотреть сообщение
pClassFactory->**** было 0xCDCDCDCD.
Так отладочные библиотеки MSVC обычно помечают неинициализированные нестатические данные, чтобы легче было при отладке обнаружить пресловутое UB, связанное с доступом к таким данных.

Добавлено через 28 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
экспорт символа "DllGetClassObject" должен быть PRIVATE
Подразумевается традиционный экспорт через DEF.
https://learn.microsoft.com/ru... w=msvc-170
https://learn.microsoft.com/ru... w=msvc-170
Windows Batch file
1
cl m.c m.def /link /dll  /noimplib /noexp /nologo & type m.def & link  /dump /nologo /exports m.exe
m.c
EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dump of file m.exe
 
File Type: DLL
 
  Section contains the following exports for m.exe
 
    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names
 
    ordinal hint RVA      name
 
          1    0 00001030 DllCanUnloadNow
          2    1 00001000 DllGetClassObject
          3    2 00001010 DllRegisterServer
          4    3 00001020 DllUnregisterServer
Добавлено через 58 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
поставил его к DllGetClassObject и DllCanUnloadNow, результат, ошибка:
error C2375: DllGetClassObject: переопределение; другое связывание
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\combasea pi.h(1434): message : см. объявление "DllGetClassObject"
error C2375: DllCanUnloadNow: переопределение; другое связывание
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\combasea pi.h(1437): message : см. объявление "DllCanUnloadNow"
Не нравится ему что-то, что я переопределяю понять не могу.
C
1
2
3
4
5
6
7
8
9
10
#include <windows.h>
 
STDAPI DllGetClassObject(
_In_ REFCLSID rclsid, 
_In_ REFIID riid, 
_Outptr_ LPVOID FAR* ppv
){ return CLASS_E_CLASSNOTAVAILABLE;}
STDAPI DllRegisterServer(){ return E_UNEXPECTED;}
STDAPI DllUnregisterServer(){return E_UNEXPECTED;}
STDAPI DllCanUnloadNow(){ return S_OK; /*S_FALSE;*/ }
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
06.03.2024, 05:19  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
дайте лучше файлы библиотеки и клиента.
Даю.
CALLPUB.rar
PUBMEM.rar
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
06.03.2024, 05:29  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Так отладочные библиотеки MSVC обычно помечают неинициализированные нестатические данные, чтобы легче было при отладке обнаружить пресловутое UB, связанное с доступом к таким данных.
Это я уже понял, но почему ошибка в коде, ведь это тоже самое что было в предыдущей программе этой же главы, с чего эта тема была начата. Опять обращение к vtbl к функциям интерфейса IUnknown.

Цитата Сообщение от politoto Посмотреть сообщение
Подразумевается традиционный экспорт через
Я иначе добавил, просто ввёл значение в командную строку linker-а или через #pragma
Code
1
2
#pragma comment(linker, "/EXPORT:DllCanUnloadNow=_DllCanUnloadNow@0,PRIVATE")
#pragma comment(linker, "/EXPORT:DllGetClassObject=_DllGetClassObject@12,PRIVATE")
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
06.03.2024, 06:22
C
1
2
3
4
5
6
7
#ifndef CINTERFACE
public:
    DClassFactory();
    ~DClassFactory();
private:
    ULONG RefCount;
#endif
Опять интерфейс содержит какие‐то поля? Удаляйте этот мусор, в интерфейсе не должно быть никаких полей, конструкторов, деструкторов. Интерфейс — это чисто абстрактный класс с чистыми фиртуальными функциями.
Исправляйте ошибку.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2024, 06:22

Access and Excel OLE object
Помогите пожалуста!!!! Как вставить рисунок с OLE object (Image) таблицы EXCEL в таблицу Acces , c помошью макроса в среде ...

ActiveX ole-object с Delphi на Qt
Всем привет. Стоит задача перенести код взаимодействия с OLE-объектами, с Delphi на QT. Вроде ничего необычного, н оне могу достучаться до...

Access and Excel OLE object
Как вствить содержимое image1 в таблицу Accecss ? И как отобразить рисунок на форме Access? Dim etr As Object Dim wbk As...

Импорт файла из OLE Object в attachment
Здравствуйте. В старой БД есть поле типа OLE Object, которое содержит изображения в формате .jpg. Показать на форме это изображение...

Как вставить рисунок с OLE object таблицы EXCEL в таблицу Acces
Как в VBA вставить рисунок с OLE object таблицы EXCEL в таблицу Acces или в другой Excel fayl


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru