Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

Проблемма при открытии СОМ порта посредством функции CreateFile   Найти похожие ветки 

 
Rule ©   (2005-09-29 14:59) [0]

Вот такая вот аномали у меня происходит, все прекрастно работает, когда открывают СОМ-порт но прихожу утром на работу и картина зачастую бывает интересная ... теперь по порядку ...

во кусок кода, которым я открываю СОМ-порт, вернее инициализирую хэндл к нему:

procedure TCustomComPort.CreateHandle;
begin
 if FHandle = INVALID_HANDLE_VALUE then CloseHandle(FHandle);
 FHandle := CreateFile(
   PChar("\\.\" + FPort),
   GENERIC_READ or GENERIC_WRITE,
   0,
   nil,
   OPEN_EXISTING,
   FILE_FLAG_OVERLAPPED,
   0);

 if FHandle = INVALID_HANDLE_VALUE then
   raise EComPort.Create(CError_OpenFailed, GetLastError);
end;

дык вот под утро начинает кричать что "не могу открыть компорт, ошибка виндовз 5", причем перезагрузка не помогает, а когда беру вытыкаю свое терминальное устройство с компорта, вставляю туда штрихкод ридер, просто читаю любой штрихкод ридером, причем на компьютере не запуская ни одной программы, тоесть читать данные некому ...
вот после этого включаю опять свое терминальное устройство в компорт и хэндл без проблем создается и все работате ....

куда копать, где собака зарылась, подскажите пожалуйста, мож есть у кого мысли по этому поводу ...
всем спасибо за внимание....


 
Reindeer Moss Eater ©   (2005-09-29 15:04) [1]

5L        ERROR_ACCESS_DENIED

Твой порт утром кем-то занят.


 
Rule ©   (2005-09-29 15:09) [2]

Reindeer Moss Eater ©   (29.09.05 15:04) [1]
да я понимаю, но если я беру допустим штрихкодридер и хипертерминал, то он работает ... чего для него не занят а для меня занят ...

и вот ситуация с перетыканием тоже вопрос ... я  ж ничего е запуска, только в компорт посылаю чегото, и то на канальном уровне ....


 
Rule ©   (2005-09-29 15:11) [3]

Reindeer Moss Eater ©   (29.09.05 15:04) [1]

да и кстати перезагрузка не помогает, может там с правами безопасности чтото надо сделать или ещё с чем, я уже не знаю что делать


 
Rule ©   (2005-09-29 15:28) [4]

тогда возникает логический вопрос, как освободить СОМ - порт ... нашел такое вот

передать Handle открытого порта дочернему процессу, для чего нужно его сдублировать (
DuplicateHandle
) и в
CreateProcess
указать нужные флаги - о наследовании хэндлов. Способ передачи произвольный - хоть через Shared Memory, хоть через командную строку.

но это ж не то чуть чуть ... ка получить хэндл открытого СОМ порта, чтоб его зарубать ???


 
simpson ©   (2005-09-29 15:43) [5]

> ка получить хэндл открытого СОМ порта, чтоб его зарубать

Очередная проктологическая операция на гландах?


 
Rule ©   (2005-09-29 15:48) [6]

simpson ©   (29.09.05 15:43) [5]
а что делать, если другого выхода нет, а если есть, то подскажи ...


 
simpson ©   (2005-09-29 15:54) [7]

Конечно, есть. Сначала нужно определить, какое приложение занимает этот порт. Вполне возможно, что и твое собственное.

Во-вторых, ты бы задачу описал, что ли. Ну и способ ее решения, реализуемый в данный момент тобой.

Плюс, не помещал бы код, помимо того, что ты привел здесь.

ЗЫ: Кстати, тут есть чудесный тэг для его (кода) оформления.


 
wal ©   (2005-09-29 15:59) [8]


> а когда беру вытыкаю свое терминальное устройство с компорта,
> вставляю туда штрихкод ридер
А может твое терминальное устройство за ночь переводит линию приема в BREAK-состояние? Хотя вроде на открытие никак не должно влиять. Но если вдруг винде придет в голову принять твое устройство за модем, то  порт может TAPI занять. Или за мышь, тогда драйвер порт для себя заберет.

С уважением.


 
Rule ©   (2005-09-29 17:01) [9]

Во-вторых, ты бы задачу описал, что ли. Ну и способ ее решения, реализуемый в данный момент тобой.

значит задача до предела простая, есть терминальное устройство, оно работает по принципу послал запрос оплучил ответ ...

я пишу драйвер под него, вернее написал ...
есть компоненты для работы с СОМ-портом
ComPort Library
by Dejan Crnila and others, 1998 - 2003
See http://comport.sf.net/ for more info

ну вот значит построи я свое приложени ена этой компоненте пару ошибок зафискил, все работает замечательно ...

но иногда, причем совершенно неожиданно происходит вышеописанная ситуация, причем интересный факт, что вот способ со сканером (просто он под рукой) помогает ...
у мнея возникли подозрения что это на уровне винды ... но почему другие приложения работающие с СОМ портом не ругаются

вышеуказанная процедура - это источник ошибки при попытке открыть порт этой библиотекой ...


 
Rule ©   (2005-09-29 17:06) [10]

simpson ©   (29.09.05 15:54) [7]
Конечно, есть. Сначала нужно определить, какое приложение занимает этот порт. Вполне возможно, что и твое собственное.


кто может занимать порт после перезагрузки компьютера, мои приложения автоматом не стартуют


 
Rule ©   (2005-09-29 17:06) [11]

simpson ©   (29.09.05 15:54) [7]
Плюс, не помещал бы код, помимо того, что ты привел здесь.

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


 
Rule ©   (2005-09-29 17:07) [12]

simpson ©   (29.09.05 15:54) [7]
ЗЫ: Кстати, тут есть чудесный тэг для его (кода) оформления.

я пользуюсь клиентом от Питера, нечетабельно тут получается если им смотреть


 
Rule ©   (2005-09-29 17:07) [13]

wal ©   (29.09.05 15:59) [8]

хмм, интересно интересно ... а как жеж определить наверняка кто владее щас портом


 
Kolan ©   (2005-09-29 17:45) [14]

А нельза просто открыть порт при старте программы и закрыть при еёзавершение.
ТЕ сидеть на нем постоянно?


 
Rule ©   (2005-09-29 17:48) [15]

Kolan ©   (29.09.05 17:45) [14]
дык так и делаю, вот и пытаюсь его открыть поэтому такая вот ошибка и возникает


 
simpson ©   (2005-09-29 17:55) [16]

> только это врядли поможет

Как скажешь.

> я привел кусок кода гед возникает ошибка

Как раз данный кусок кода работает правильно. Можно получить доступ к порту - он  его открывает. Нельзя - генерит исключение. Где же здесь ошибка?

Ошибка у Вас, уважаемый, как всегда, в 17-й строке.


 
Rule ©   (2005-09-29 18:06) [17]

simpson ©   (29.09.05 17:55) [16]

ну логически то пришли то к ответу ... что порт занят поэтому и генерит такую ошибку ...
вопрос в том как его освободить и вот анамалия с штрихкодридером и другими приложениями, им то пофиг ... почемуто порт занят только для меня


 
umbra ©   (2005-09-29 18:30) [18]

Но ведь ошибки EComPort нет? значит, он открывается. а ошибка виндоуз случается позже


 
Fay ©   (2005-09-29 20:11) [19]

2 umbra ©   (29.09.05 18:30) [18]
>> Но ведь ошибки EComPort нет?
А в каком месте приведённого кода предполагается возникновение этой (EComPort) ошибки?
И чё это ваще за ошибка такая?


 
umbra ©   (2005-09-29 20:14) [20]

2 Fay ©   (29.09.05 20:11) [19]

см. пост 0


 
Rule ©   (2005-09-29 20:15) [21]

да не вообщето исключение EComPort я генерю сам, вернее автор копмонентов, вопрос в том что порт занят уже, но как он может быть занят если даже перезагрузка не понимает ...
во вторых пугает вот то что для других приложений он свободен ...


 
umbra ©   (2005-09-29 20:16) [22]


> И чё это ваще за ошибка такая?


А ето я не в курсах. Гаварят далжна быть инагда


 
umbra ©   (2005-09-29 20:20) [23]


> Rule ©   (29.09.05 20:15) [21]


Это исключение генерит программа, если не может открыть порт. Оно случается? Если нет, то порт успешно открывается.


 
Rule ©   (2005-09-29 20:23) [24]

кстати вот мысть пришла в голову, а если допустим мое приложение захватывает порт функицией CreateFile  потом неправильно закрывается и естественно не освобождает хэндл, он же продолжает висеть, правильно ???, вот интересно что в таком случае делать ...

в голову лезет только один вариант, хранить в реестре или в инифайе хэндл после открытия порта и стирать его после закрытия, тоесть если там значение есть, значит в прошлый раз программа плохо вышла и этот хэндл и есть хэндл порта ...

тем более что двух экземпляров приложения быть не может, так как это мультиинстанс СОМ-сервер ...

кто может чего сказать по этой мысли ...


 
Rule ©   (2005-09-29 20:24) [25]

umbra ©   (29.09.05 20:20) [23]
Это исключение генерит программа, если не может открыть порт. Оно случается? Если нет, то порт успешно открывается.


ну это я знаю, но оно генерится именно если инвалид хэндл, и выдет всегда номер ошибки 5, тоесть доступ закрыт, компорт кемто занят ... как было сказано выше ...
вопрос щас в том что делать в таком случае, как получить доступ к порту "внаглую"


 
GanibalLector ©   (2005-09-30 02:59) [26]

2 Rule ©
Уважаемый,а зачем гадать??? Проверь утилитой PortMon от дяди М.Руссиновича.

>вопрос щас в том что делать в таком случае, как получить доступ к порту "внаглую"

Никак!


 
Rule ©   (2005-09-30 09:23) [27]

GanibalLector ©   (30.09.05 2:59) [26]
Уважаемый,а зачем гадать??? Проверь утилитой PortMon от дяди М.Руссиновича.
а каким тамким чудесным образом эта утилита покажет кто захватил мой порт ???
ЗЫ: утилита действительно дельная :-))), именно ей всегда и пользовался, спасибо Руссиновичу :-)))

Никак!
очень печально в таком случае ...



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.044 c
2-1132475688
Alex77777
2005-11-20 11:34
2005.12.04
"Зациклить" форму


3-1129812996
DelphiLexx
2005-10-20 16:56
2005.12.04
FIBDataSet и параметр


3-1129882852
Боря
2005-10-21 12:20
2005.12.04
Filter в StoredProcedure


2-1132224912
Al_Ba
2005-11-17 13:55
2005.12.04
Как программноно передвигаться по индексам TreeView


14-1131600217
ZeroDivide
2005-11-10 08:23
2005.12.04
Что за контора такая: ОЛДИ (Москва)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский