C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как создать в dll один класс для всех, подключающихся процессов
Андрей
Отправлено: 06.04.2005, 11:59


Не зарегистрирован







Значит такая ситуация:
1. есть класс-поток class TOpros : public TThread {......}, он берет данные из ком-порта
2. есть dll в которой я делаю следущее:
CODE

TOpros *Opros;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
 ... // здесь идет иниц. разделяемой памяти в которую Opros кладет данные

 case DLL_PROCESS_ATTACH:
 {
  ...
        Opros=new TOpros(true);
            if(Opros->Init()!=0)
             Application->MessageBox("Невозможно захватить порт","dll",0);
            else
            {
             Application->MessageBox("порт захвачен","dll",0);
      Opros->Start(); // старт потока
            }
               }
 break;
...

}


3. Из главной программы вызываю LoadLibrary("opros.dll"). Данные нормально считываются.
Если я запущю вторую копию программы, то порт не захватывается ( CreateFile() ), загрузка процессора 100%,
но данные я могу снимать, т.к. они лежат в общей памяти. Теперь если я закрою первую прогу, то новых данных не будет.

Вопрос такой: как мне в длл сделать Opros=new TOpros(true) для всех подключающихся процессов? У меня в длл есть переменная bool first в которой опеределяется что первый процесс подключается к длл, может это
поможет.
mlind
Отправлено: 06.04.2005, 12:12


Ученик-кочегар

Группа: Участник
Сообщений: 7



До почты добрался, выше — это мой вопрос. Вдогонку

Ком-порт я открываю так:
ComPort=CreateFile(Port.c_str(),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, NULL, NULL );

Но вторая запущенная прога всеравно не хочет его инициализировать


Rius
Отправлено: 06.04.2005, 20:10


Мастер участка

Группа: Участник
Сообщений: 321



Забудь...
QUOTE
The CreateFile function opens a communications port. There are two ways to call CreateFile to open the communications port: overlapped and nonoverlapped. The following is the proper way to open a communications resource for overlapped operation:
HANDLE hComm;
hComm = CreateFile( gszPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (hComm == INVALID_HANDLE_VALUE)
// error opening port; abort
Removal of the FILE_FLAG_OVERLAPPED flag from the call to CreateFile specifies nonoverlapped operation. The next section discusses overlapped and nonoverlapped operations.
The Platform SDK documentation states that when opening a communications port, the call to CreateFile has the following requirements:
fdwShareMode must be zero. Communications ports cannot be shared in the same manner that files are shared. Applications using TAPI can use the TAPI functions to facilitate sharing resources between applications. For Win32 applications not using TAPI, handle inheritance or duplication is necessary to share the communications port. Handle duplication is beyond the scope of this article; please refer to the Platform SDK documentation for more information.
• fdwCreate must specify the OPEN_EXISTING flag.
• hTemplateFile parameter must be NULL.


Это из присоединенного файла Serial Communications in Win32.doc

Можно сделать по-другому: хранить хэндл открытого порта в глобальной переменной в DLL (и его возвращать), либо в вызвавшей программе.

Отредактировано Rius — 07/04/2005, 00:51

User Attached Image Скачать файл
Serial_Communications_in_Win32_2005.04.06___23.10.rar


mlind
Отправлено: 07.04.2005, 07:25


Ученик-кочегар

Группа: Участник
Сообщений: 7



Мне не надо иниц. порт два раза, мне нужно чтобы класс в dll, созданный первым процессом был доступен второму.
olegenty
Отправлено: 07.04.2005, 08:32


Ветеран

Группа: Модератор
Сообщений: 2412



тогда сделай его расшаренным, т.е. помести в расшаренный сегмент dll. тогда, при первом соединении с dll он будет создаваться, а при прочих других — использоваться. ну и удаляться — только при последнем отсоединении. вот как это можно сделать:
Shared переменные в DLL
mlind
Отправлено: 07.04.2005, 09:46


Ученик-кочегар

Группа: Участник
Сообщений: 7



А как правильно добавить dlldef.def ? Я делаю через "Project->Add to Project..."
Кода жму "Build All Projects" появляется ошибка
[Linker Error] Section SHARESEG defined in .def file is empty

Всё сделал как по ссылке:

//---- begin file dlldef.def ----//

LIBRARY DLLMAIN

SEGMENTS
SHARESEG CLASS "SHARECLS" SHARED
mlind
Отправлено: 07.04.2005, 10:29


Ученик-кочегар

Группа: Участник
Сообщений: 7



Хмм..странно, заработало. Ошибка исчезла.

2Rius:
Спасибо за доку

2olegenty:
Спасибо за помощь, всё работает как надо!

olegenty
Отправлено: 07.04.2005, 10:37


Ветеран

Группа: Модератор
Сообщений: 2412



You're welcome ! biggrin.gif

Вернуться в Вопросы программирования в C++Builder