Андрей |
Отправлено: 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
|
Скачать файл |
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 !
|
|