|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Чтение с Com порта в синхронном режиме (DLL)
Здравствуйте, есть модуль в Delphi в котором реализована функция приема данных с COM порта
Код:
function Readp(Fhandle:Thandle): shortstring; var Buf:pointer; dwRead : Cardinal; s:shortstring; begin Buf := GetMemory(255); s := ''; ReadFile(FHandle, Buf^, 255, dwRead, nil); s := String(Buf); result:=Copy(s,1,dwRead); Freememory(Buf); end; Функция работает, и все прекрасно считывает. 1 вопрос: При переносе этой функции в DLL и подключения DLL в программу ничего не считывается. В чем может быть проблема? 2 вопрос: если в функции result-значение вместо shortstring я ставлю string ничего не считывается и выход из функции сопровождается ошибкой "Invalid Pointer Operation". в чем может быть причина и как от этого можно избавиться? К тому же данная ошибка проявляется и с shortstring но уже при выходе из программы. В инете нашел что Цитата:
|
#2
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Эти 2 пользователя(ей) сказали Спасибо Alegun за это полезное сообщение: | ||
alexusankov (28.06.2013),
Rorzakh (28.06.2013)
|
#3
|
||||
|
||||
Вроде нельзя вот так просто взять и Pointer привести в String. В строке перед началом самой строки должна быть длина и выделенное кол-во байт. Лучше попробуй использовать PChar вместо Pointer.
Ну и то, что написал Alegun, естественно. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Rorzakh (28.06.2013)
|
#4
|
|||
|
|||
Alegun, Bargest спасибо за советы!
Сделал вот так. Как и в прошлый раз в модуле все отлично работает а в dll не хочет. Правильно ли я вас понял? Если да, то такой вопрос, символы приходят, но во первых почти всегда одно и тоже (посылаю разные наборы символов), во вторых символы какие то непонятные. Что это такое и как с этим разобраться? Код:
function readport(hport:Thandle):Pchar; stdcall; var Buf : PChar; dwRead : Cardinal; begin Buf := GetMemory(255); ReadFile(hport, Buf^, 255, dwRead, nil); result := Buf; FreeMemory(buf); end; Последний раз редактировалось Rorzakh, 27.06.2013 в 13:55. |
#5
|
||||
|
||||
принимай буфер и его размер в качестве параметра функции, а возвращай количество прочитаных байт. соответственно память выделяй в exe.
зачем stdcall, в exe также? есть ли смысл вообще это в dll переносить? Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Rorzakh (28.06.2013)
|
#6
|
|||
|
|||
NumLock
Если выделять память то только в dll так как в дальнейшем она будет подключаться не к exe. В инете нашел такой код Код:
function Readport(fHandle:Thandle) : byte; var dwRead : Cardinal; buf:array [0..$FF] of Char; begin ReadFile(FHandle, Buf, SizeOf(buf), dwRead, nil); Result := Byte(Buf[0]); end; |
#7
|
||||
|
||||
А вы при вызове библиотеки в неё хендл апликации передаёте? В смысле, Application.Handle
З.Ы. В функции из 4 поста перед строкой result:=Buf желательно добавить Код:
SetLength(buf, dwRead); Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 28.06.2013 в 10:22. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Rorzakh (28.06.2013)
|
#8
|
|||
|
|||
Цитата:
Цитата:
Delphi ругнулся Цитата:
Последний раз редактировалось Rorzakh, 28.06.2013 в 10:29. |
#9
|
|||
|
|||
Цитата:
Спасибо ваш совет действительно помог |