![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
WantToProg |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Доброго времени суток уважаемые программисты. В очередной раз хочу вас побеспокоить.
Имеется такой код на Си
Работа его заключается в очистке терминала от всех символов и печать на нем текста Hello world. Все бы ничего, да только надо мне этот код на delphi, а как это сделать, я к сожалению не знаю. Несколько предположений все таки сделал, но они не работают. Итак, первое Unsigned Char в Delphi можно представить как Word, ну или Byte. Таким образом получится:
Но не понимает Delphi данные в строке sdbuff := 0x1b;, говорит Missing operator or semicolon. То есть не хочет читать данные в шестнадцатиричном представлении. Я очень прошу подсказать, что я тут не так делаю. Да и вообще, как послать чудо терминалу такую команду? |
||||
|
|||||
Лапоть |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 3.4.2009 Репутация: нет Всего: 2 |
||||
|
||||
WantToProg |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Такс, с представлением все ясно. Теперь проблемка с Unsigned Char, если не Word, то что тогда? Byte - не работает тоже, почему-то посылается непонятный набор символов, а не комманда $1b Что-то я делаю не так :( Забыл упомянуть про функцию MySocketSend Она обрабатывается в другом модуле как:
Вопрос в принципе так и остается, как это сделать на Delphi. Писал его под Linux на Си, теперь надо внедрить в 1С, и есть модуль на Delphi, вот и пытаюсь что то сделать. Это сообщение отредактировал(а) WantToProg - 26.4.2009, 13:36 |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Это сообщение отредактировал(а) kami - 26.4.2009, 13:31 |
|||
|
||||
WantToProg |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
kami, Огромное спасибо. Но остался один небольшой вопрос:
Что делать, если вместо текста '$Hello World' должна быть переменная? Как тогда организовать функцию? по какойто неведомой мне причине
Не работает :( Это сообщение отредактировал(а) WantToProg - 26.4.2009, 14:39 |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
Вот это не поможет?
|
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Причины неведомыми не бывают. Либо компилятор что-нибудь скажет, либо в run-time ошибка вылезет. Весьма полезно вместо "Аааа, ничего не работает" говорить конкретные причины, например "Компилятор говорит Undeclared identifier: str" или "ESocketError 10061" Показанный вами код вполне работоспособен. Еще раз:
Добавлено через 3 минуты и 54 секунды Я еще многого мало знаю, но причем здесь преобразование в Hex представление? |
|||
|
||||
WantToProg |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Не, это тут как бы не при чем. Да, я согласен с вами, и код работоспособен и ошибок нет. Но вот не очень понятно следущее: Если я использую:
результат: Hello World - Все понятно, все нормально, команда #$1b, очищает экран если:
результат: #$1b и дальше содержимое переменной. то есть команда воспринимается как набор печатаемых символов, то есть не очищает экран. А если же:
результат: только содержимое переменной, команда #$1b почему то игнорируется, т.е. не очищает экран. В этом и есть суть вопроса. Почему в одной ситуации, без переменной, команда работает, а с переменной нет. |
||||||
|
|||||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Поставьте breakpoint на строку Winsock.send(Sock, SendData[1], Length(SendData), 0); и посмотрите, чему равно SendData.
Добавлено через 1 минуту и 10 секунд Код самой процедуры отправки и процедуры, ИЗ КОТОРОЙ она вызывается в студию. Добавлено через 7 минут и 52 секунды И естественно. В этом случае к str спереди линкуются 4 символа: #+$+1+b , что само собой ни разу не эквивалентно #$1b |
|||
|
||||
WantToProg |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Это компонента .dll для 1С BP не добавить, поэтому я добавил объект
содержимое SendData = str символом . О чем это может говорить? Это сообщение отредактировал(а) WantToProg - 26.4.2009, 17:28 |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Это может говорить только об одном:
#$1b не добавлено спереди к переменной str. Или же добавлено, но не к той переменной. (и это вполне серьезно, без иронии).
Добавлено через 1 минуту и 3 секунды Кстати, #$1b выглядит в сообщении, как квадратик. Добавлено через 10 минут и 22 секунды Так внесите логирование через каждую строчку в файл. "Получили данные для отправки. str='+str "соединили с символом. SendData='+SendData "Отправляем SendData. SendData='+SendData |
|||
|
||||
WantToProg |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Да, да. Я просто забыл добавить к переменной. Выглядит именно так. Таким образом символ #$1b действительно отсылается, но почему то не воспринимается как комманда
Прикрепляю файл на всякий случай, там как раз описан процесс подключения Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Начнем с малого (остальное пока смотрю).
потоковая функция должна быть объявлена как function send_thread(Parameter: Pointer): Integer; stdcall;. - иногда полезно смотреть исходники Delphi. Если параметр в данном случае значения не имеет (у integer и pointer размерность одна), то выделенное жирным шрифтом (т.е. отсутствующее у вас - это, извините, очень грубая ошибка). В дополнение, если работаете с CreateThread в Delphi (хотя это не рекомендуется, безопаснее пользоваться BeginThread), то выставьте хотя бы IsMultiThread:=True; Во-вторых - в корне неверная работа с сокетами (архитектурно, я имею ввиду). Извините, но так писать нельзя. Правда, это тема для отдельной ветки, посему опустим. У вас есть какой-нибудь сниффер, например WireShark ? Если да - посмотрите, что на самом деле отсылаете, потому что других проблем на первый взгляд не видно. Добавлено через 7 минут и 48 секунд Почему бы, кстати, не воспользоваться ClientSocket вместо всей этой возни с WinSock? Было бы гораздо проще и нагляднее... Добавлено через 9 минут и 27 секунд
А он воспринимается как команда сразу после приема получателем, или после того, как получателю дойдут CRLF -символы ? |
|||
|
||||
WantToProg |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Все, огромное спасибо, проблема решена. На самом деле, нужно было немного включить мозг. Спешка мешает серьезно.
нужно было добавить '$' таким образом
И все заработает. Я был бы не прочь посмотреть другие варианты работы с сокетами. Просто в Delphi пишу первый раз и первую программу. Да если честно, вообще опыта не много. Учусь так сказать ![]() |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
WantToProg |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 13.4.2009 Репутация: нет Всего: нет |
Данные отсылаются на сканер штрих кодов, а как он работает я понятия не имею. Все вычислял эмпирическим путем, т.е. наугад.
Да я сам понятия не имел ![]() Благодарю за помощь, но чувтствую не последний раз спрашиваю |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |