Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование (VB,C#,ASP,.NET): новости, советы, примеры



Выпуск # 180


http://www.kbyte.ru/

 

Новый выпуск!

Здравствуйте дамы и господа!
Очередной выпуск рассылки Kbyte.Ru!

 

Содержание выпуска

Система ЭКСПЕРТ

    Вопрос #000438: Вопрос по С#

    Вопрос #000437: Содержимое динамически созданных элементов

    Вопрос #000436: Вопрос по C#

    Вопрос #000433: Расширенное воспроизведение звука

    Вопрос #000429: Как узнать IP-адрес?

Последнее на форумах

    Блокнот

    Visual Studio Addin

    Таблицы и формы

    У кого из нас странности: у меня или у конрола?

    Управляемый плугин к QIP Infium

Последние статьи

    Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)

    Работа с SQL – Запросы

    Использование XML.Serialization

    Выбор языка программирования для научных работ (2-я редакция)

    Работаем с MIME

Интересные коды и решения

Юмор на Kbyte.Ru

 

Система ЭКСПЕРТ

 

Система «Эксперт» - уникальная система, которая поможет решить, если не все, то многие Ваши проблемы с программированием и разработкой! Если у Вас есть какой-либо вопрос по программированию или разработке, то Вы всегда можете задать его нашим Экспертам! При этом каких-либо особых действий от Вас не потребуется! Просто отправьте Ваш вопрос на адрес mailto:expert@kbyte.ru, в теме письма укажите тему вопроса, в тексте – сам вопрос, и все! Эксперты дадут Вам ответ в течение 12-24 часов, на тот адрес, с которого Вы отправите вопрос. Все проще простого! Никакой регистрации и заполнение бесконечных форм, никаких наездов, оскорблений и насмешек со стороны гуру, просто спросите и получите ответ ;-)


Вопрос #000438: Вопрос по С#

Автор вопроса: Sergey Guznenkov // 29.08.2007 / 06:13

Добрый день. Подскажите пожалуйста, как можно сделать доступными таблицы для других, открываемых позже форм ?
Есть главная форма, на ней присутствует несколько довольно больших таблиц, потом я открываю другую форму (таких форм будет несколько) и там нужно обработать данные из некоторых таблиц главной формы.
Заранее спасибо.

Отвечает: EROS // 29.08.2007 / 20:11

Здравствуйте, Sergey Guznenkov

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


--
С уважением,
EROS mailto:eros@fromru.com

 

Вопрос #000437: Содержимое динамически созданных элементов

Автор вопроса: "Abu Ali" // 29.08.2007 / 06:13

Здравствуйте уважаемые Эксперты. Вопрос: Существует форма с динамечески созданными элеметами управления (ComboBox и TextBox ) frmBox. Из главной формы вызывается метод формы frmBox, который в зависимости от параметра, создает определенное количество ComboBox и TextBox. Потом при вызове из главной формы еще одного метода формы frmBox, который присваивает значения элементов управления переменным, при foreach (Control c in this.Controls) он не видит элементы созданные программно. Заранее благодарен

Отвечает: Алексей Немиро // 29.08.2007 / 07:58

Здравствуйте, Abu Ali!

Полагаю, проблема в том, что Вы создаете новый экземпляр формы frmBox,
который, естественно, не содержит динамически созданных элементов.

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

В будущем, вопросы без указания языка программирования, на рассмотрение приниматься не будут.

ЗЫ: Вы можете воспользоваться нашим
форумом для решения этой проблемы.
Для работы с форумом требуется
регистрация.
После регистрации, Вы можете подписать на Forum Mail Conference – это возможность работы с форумами сайта через E-Mail.
Подробности смотрите тут. (после подписки на FMC и добавления на форум нового сообщения через Web-интерфейс, Вам будет выслан шаблон письма для работы с форумами через E-Mail).




--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000436: Вопрос по C#

Автор вопроса: Sergey Guznenkov // 29.08.2007 / 06:13

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

Есть главная форма, на ней присутствует несколько довольно больших таблиц,

потом я открываю другую форму (таких форм будет несколько) и там нужно

обработать данные из некоторых таблиц главной формы.

Заранее спасибо.

Отвечает: Алексей Немиро // 29.08.2007 / 07:45

Здравствуйте, Sergey!

Можно в первой форме создать свойство, через которое можно будет
получать и/или изменять параметры элементво формы. Например:

Form1
001:
002:
003:
004:
005:
public string FormTitle
{
 get { return this.Text; }
 set { this.Text = value; }
}


Далее, в Form2 можно написать:
001:
((Form1)Application.OpenForms["Form1"]).FormTitle = "Kbyte.Ru";

таким образом, заголовок Form1 будет изменен на "Kbyte.Ru".
Таким же образом можно сделать с любым другим свойством формы, или элементами формы.

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


--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000433: Расширенное воспроизведение звука

Автор вопроса: Arcady // 26.08.2007 / 15:00

Здравствуйте эксперт!

Вопрос:
Возможно-ли на Visual Basic 6.0 без использования посторонних библиотек (например, fmod.dll) реализовать воспроизведение звука "на своём канале"? То есть, создать (открыть) свой звуковой канал, чтобы воспроизводить в нём не только WAVE, но и, хотя бы MP3, и задавать для него громкость независимо от Windows? Например, как в Winamp, или в той-же библиотеке fmod.dll.

Заранее благодарен.

--------------------------------------
Категория: --- Visual Basic 5.0/6.0

Отвечает: Алексей Немиро // 26.08.2007 / 15:54

Здравствуйте, Arcady!

Стандартными средствами Visual Basic 6.0, без использования сторонних библиотек и компонентов, это сделать не возможно.

--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000429: Как узнать IP-адрес?

Автор вопроса: Андрей // 24.08.2007 / 19:28

Как узнать IP-адрес активного интернет-подключения средствами VB6?

--------------------------------------
Категория: --- Visual Basic 5.0/6.0

Отвечает: Алексей Немиро // 26.08.2007 / 04:28

Здравствуйте, Андрей!

Создайте стандартный EXE-проект. Расположите на форме (Form) элемент Winsock (меню: Проект -> Компоненты -> Microsoft Winsock Control 6.0) и добавьте нижеследующий код.

001:
002:
003:
Private Sub Form_Load()
 MsgBox "Ваш IP: " & Winsock1.LocalIP
End Sub


--
С наилучшими пожеланиями,
Немиро Алексей

 


Чтобы задать Ваш вопрос, отправьте его на адрес expert@kbyte.ru

Раздел Эксперт на сайте Kbyte.Ru

Наверх

 

 

Последнее на форумах

Блокнот | Автор: Stuart
Добавлено: 30.08.2007 / 16:45 | ответов: 2 | просмотров: 37

У меня вот вопрос, вот допустим я сделал Блокнот, и мне нужно чтобы когда я открывал например файл TXT (C:\1.txt), он открывался через мою программу и в тестовом поле был виден текст, который находиться в файле TXT. Как мне сделать так, чтобы при открытие TXT файла с помощью моей программы, она находила путь где находить TXT файл?

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:31.08.2007 / 03:42
Используйте функцию Command, она как раз и будет содержать
параметры запуска программы. Для тестов, создайте стандартный
EXE-проект, в событие Form_Load вставьте код: MsgBox Command,
компилируйте проект, и запустите через "Пуск -> Выполнить", примерно
так: ПутьКВашейПрограмме Какая-НибудьСтрока
C:\windows\notepad.exe строка

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: Алексей
Добавлено:31.08.2007 / 04:58
Поповоду пути, нужно ассоциировать тип файла *.txt c вашей программой. Для этого можно использовать следующий код:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
'Внимание: Вы используете этот код на свой страх и риск!
'Всю ответсвенность за последствия использования данного кода несете только ВЫ и только ВЫ!
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const REG_SZ = 1
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const SYNCHRONIZE = &H100000
Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))

Private Sub AssociateFile(fExtension As String, dType As String, tDescription As String, aPath As String, nIcon As Integer)
  'on error resume next
  Dim RetVal As Long, kWnd As Long, dCommand As String
  dCommand = "\shell\open\command"
  RetVal = RegCreateKey(HKEY_CLASSES_ROOT, fExtension, kWnd)
  RetVal = RegSetValue(HKEY_CLASSES_ROOT, fExtension, REG_SZ, dType, Len(dType))
  RetVal = RegCloseKey(kWnd)
  RetVal = RegCreateKey(HKEY_CLASSES_ROOT, dType & dCommand, kWnd)
  RetVal = RegSetValue(HKEY_CLASSES_ROOT, dType, REG_SZ, tDescription, Len(tDescription))
  RetVal = RegSetValue(HKEY_CLASSES_ROOT, dType & dCommand, REG_SZ, aPath & " %1", Len(aPath) + 3)
  RetVal = RegCloseKey(kWnd)
  RetVal = RegCreateKey(HKEY_CLASSES_ROOT, dType & "\DefaultIcon", kWnd)
  RetVal = RegSetValue(HKEY_CLASSES_ROOT, dType & "\DefaultIcon", REG_SZ, aPath & "," & nIcon, Len(aPath) + Len(CStr(nIcon)) + 1)
  RetVal = RegCloseKey(kWnd)
End Sub
'************************************************************

Private Sub Form_Load()
 'Ассоциируем файл
 AssociateFile ".txt", "textfile", "Текстовой документ", "C:\Windows\Notepad.exe", 1
End Sub

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Visual Studio Addin | Автор: 5acred Phoenix
Добавлено: 30.08.2007 / 13:38 | ответов: 1 | просмотров: 25

Нет, в моих руках почему-то всё отказывается работать :-\ В аттаче — проект.

На этой строчке
001:
002:
003:
If (Not toolWins Is Nothing) Then toolWin.Visible = True

Colorized by: Eros.CodeSyntaxColor Engine
запускаемая дебаггером копия IDE с грохотом вылетает, успевая только сказать о COMException.

Чую, что это может быть связано с контролом. Правильно чую?

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 13:41
Блин, аттач забыл добавить.. Что за жизнь?.. :-)

http://sacredphoenix.nm.ru/CommandLineToolAddin.rar

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Таблицы и формы | Автор: Face
Добавлено: 30.08.2007 / 13:04 | ответов: 6 | просмотров: 71

Доброе время суток =). У меня есть следующий вопрос: Есть несколько таблиц(довольно объёмных), которые заполняются данными из файлов. Таблицы находятся на главной форме. Есть острая необходимость работать с ними (таблицами) на других, открываемых позже формах. Заново создавать и заполнять их каждый раз на новой форме - бессмысленная трата бесценной памяти. Теперь сам вопрос: " Как передать ссылку на эти таблицы другим формам ? "
Заранее спасибо.

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: EROS
Добавлено:30.08.2007 / 14:32
У Вас есть 2 очевидных пути решения..
1. Передать ссылку в другую форму через конструктор
2. Открыть доступ к таблице через свойство формы..

Какой способ предпочитаете?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: Face
Добавлено:30.08.2007 / 15:11
Тогда еще один вопрос, какой способ лучше ? Или так, какие плюсы у одного и у другого? И еще, а можно на примере ?
Поясню - я только начал изучать C#....
Заранее спасибо.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: EROS
Добавлено:30.08.2007 / 15:21
Тогда еще один вопрос, какой способ лучше ?

Разницы никакой! Результат обоих вариантов один и тот же.. Вы будете иметь на руках ссылку на таблицу в главной форме..
Это лишь дело личных предпочтений.. Лично я предпочитаю использовать перегруженный конструктор формы..
Пример могу набросать только вечером.. тут студии нет под рукой.. (((
И еще.. что Вы называете таблицей? DataTable или DataGrid?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 4 | Автор: Face
Добавлено:30.08.2007 / 15:25
Ok, спасибо, подождём до вечера =)
И еще.. что Вы называете таблицей? DataTable или DataGrid?

DataTable

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 5 | Автор: EROS
Добавлено:30.08.2007 / 22:28
Запусти пример и потыкай по заголовкам столбцов.. попробуй изменить запись..
Все изменения отразятся в подчиненной форме...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 6 | Автор: Face
Добавлено:31.08.2007 / 10:41
Спасибо за пример, щас буду глядеть =)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


У кого из нас странности: у меня или у конрола? | Автор: 5acred Phoenix
Добавлено: 29.08.2007 / 15:35 | ответов: 20 | просмотров: 218

Это опять я :-)

Из статьи MSDN выдрал пример написания собственного Command Prompt (TextBox, который редиректит введенные команды запущенному и скрытому cmd.exe).
Есть некоторые артефакты (в stdout возвращаются введенные команды; при наборе неверной команды — cmd.exe летит). Подскажите, пожалуйста, что не так...

Проект VB.NET: http://filehost.net.ru/3150957

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:29.08.2007 / 16:09
Интересный пример, как раз тут кто-то про консоль недавно спрашивал, но только на VB 6.0 :)

Насчет вылета, посмотрел поверхностно, действительно вылетает, почему
хз, надо более детально смотреть :) Могу предложить проверять процесс и если он отбросил копыта, запускать
заново :)


зы: 5acred Phoenix +unlim file size

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: 5acred Phoenix
Добавлено:29.08.2007 / 16:31
Могу предложить проверять процесс и если он отбросил копыта, запускать
заново :)

Кривое, конечно, решение... :))

зы: 5acred Phoenix +unlim file size

o_0

ЗЫ. Эту консольку, кстати, хочу прикрутить к Visual Studio IDE. Эдакий inline SDK Command Prompt :-)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: EROS
Добавлено:29.08.2007 / 21:02
А чего вы ожидали?? Обработка ошибок отключена! В результате мы имеем следующее: При возникновении ошибки процесс ее обрабатывает и пытается вывести сообщение об ошибке в свое окно ( а его-то нет!!! и при попытке вывести все это дело в ErrorStream все падает), а посколько RedirectStandardError для ProcessStartInfo в примере отключен, то процесс и вылетает с ошибкой.. Включи RedirectStandardError и будет процесс будет жить вечно :-)
А если еще прикрутишь вывод ErrorStream (обязательно через делегата надо делать т.к. это другой поток.. иначе получишь CrossThredException) то вообще будет тебе счастье!

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 4 | Автор: 5acred Phoenix
Добавлено:29.08.2007 / 21:13
Дельно, а главное объяснено :-) Большое спасибо :-)
А что делать с выводящимися cd и пр. командами, предваряемых квадратиком?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 5 | Автор: EROS
Добавлено:29.08.2007 / 22:20
А что делать с выводящимися cd и пр. командами, предваряемых квадратиком?

Тут все очень просто.. Квадратик в самом начале есть не что иное как символ возврата каретки Chr(13).. потом идет твоя команда и в конце 2 байта это Chr(13) и Chr(10), что равняется переводу строки - vbNewLine ..
Могу предложить следующий вариант решения:
1. Создаешь строковую переменную уровня класса. В неё в процедуре OnKeyDown будешь записывать последнюю введенную команды. Таким образом у тебя всегда будет сохранена последняя команда..
2. В процедуре OnStdOut делаешь следующее:
- С помощью Trim() обрезаешь полученные данные. Эта команда удалит все непечатаемые символы первый квадратик и и последний перевод строки.. В итоге у тебя будет просто полученный текст.
- Делаешь проверку: Если полученные данные равны введенной команде, то заменяешь все эти данные на vbNewLine , либо просто игнорируешь (что больше нравится), а если не равны, то ничего не делаешь и все идет своим чередом

вот, собственно, и все..

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 6 | Автор: EROS
Добавлено:29.08.2007 / 23:42
Забыл сказать.. первый квадратик появляется из твоего нажатия Enter.. чтобы от него избавиться замени ф-ю OnKeyPress на эту:
001:
002:
003:
004:
005:
Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
    inputString.Append(IIf(e.KeyChar = ControlChars.Cr, String.Empty, e.KeyChar))
  End Sub

Colorized by: Eros.CodeSyntaxColor Engine


Я так же организовал вывод ошибок в это окно + то что писал выше про lastCmd, и все работает отлично.. указанные тобой артефакты не наблюдается.. Получилась точная копия станлартного окна..

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 7 | Автор: Алексей
Добавлено:30.08.2007 / 03:07
зы: 5acred Phoenix +unlim file size

o_0

Анлим на размер аттачей в сообщениях форума. На самом деле
этот анлим вовсе не анлим :), ограничение на суммарный размер файлов в
одном сообщении - 10 метров, но злоупотреблять этим не стоит, место на
хостере все же ограничено. Максимум рекомендую цеплять к одному
сообщению аттачи размером не более 512-1024 кб.

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 8 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 10:05
EROS, отлично, сейчас всё исправим и можно будет писать плугин к VS IDE ;-)
Большое спасибо вам!

Алексей, а форум пишеть макс. 8,47 Кб и т.д., о как хитро оказывается :-))

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 9 | Автор: Алексей
Добавлено:30.08.2007 / 10:22
Алексей, а форум пишеть макс. 8,47 Кб и т.д., о как хитро оказывается :-))

Сейчас он должен писать 10240 кб. Если не пишет, значит баг.. бум лечить :)

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 10 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 11:06
Не, форум исправился :-)
Кстати ждём мою мессагу через FMC...... :-))

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 11 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 12:23
Всё равно контрол себя странно ведёт..
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
Imports System.IO
Imports System.Text
Imports System.Diagnostics
Imports Microsoft.VisualBasic.ControlChars

<System.Drawing.ToolboxBitmap(GetType(CmdTextBox), "CmdTextBox")> _
Public Class CmdTextBox

  Inherits System.Windows.Forms.TextBox

  Private cmdProcess As Process = Nothing
  Private stdIn As StreamWriter = Nothing
  Private stdOut As StreamReader = Nothing
  Private stdErr As StreamReader = Nothing
  Private outputBuffer(511) As Byte
  Private errorBuffer(511) As Byte
  Private inputString As New StringBuilder()

  Private lastCmd As String = String.Empty

  Protected Overrides Sub OnCreateControl()
   MyBase.OnCreateControl()

   ' Set control properties
   Me.AcceptsReturn = True
   Me.AcceptsTab = True
   Me.Multiline = True
   Me.BackColor = System.Drawing.Color.Black
   Me.ForeColor = System.Drawing.Color.Lime
   Me.Font = New System.Drawing.Font("Lucida Console", 9, System.Drawing.FontStyle.Regular)

   If (Me.DesignMode) Then Return

   ' Create cmd.exe, turning off the window and redirection i/o to us
   Dim info As New ProcessStartInfo("cmd.exe")
   With info
     .CreateNoWindow = True
     .RedirectStandardError = True
     .RedirectStandardInput = True
     .RedirectStandardOutput = True
     .UseShellExecute = False
   End With
   cmdProcess = Process.Start(info)

   ' Capture i/o
   stdOut = cmdProcess.StandardOutput
   stdErr = cmdProcess.StandardError
   stdIn = cmdProcess.StandardInput
   stdIn.AutoFlush = False ' mcw: was true; see OnKeyDown

   System.Threading.Thread.Sleep(100)

   ' Begin async read on standard error and output
   ErrorBeginRead()
   OutputBeginRead()
  End Sub

  Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
   ' Return MyBase.IsInputKey(keyData)
   Return True
  End Function

  Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
   ' NOTE: Not calling the base...
   ' MyBase.OnKeyDown(e)
   e.Handled = True

   ' mcw: only send printable characters; and explictly flush
   ' when ENTER is pressed
   Select Case (e.KeyCode)

     Case System.Windows.Forms.Keys.Enter

      ' Save last typed command
      lastCmd = inputString.ToString()

      stdIn.WriteLine(inputString.ToString())
      stdIn.Flush()
      inputString = New StringBuilder()

     Case System.Windows.Forms.Keys.Back

      inputString.Remove(inputString.Length - 1, 1)

   End Select
  End Sub

  Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
   ' NOTE: Not calling the base...
   ' MyBase.OnKeyPress(e)
   ' e.Handled = True

   If (e.KeyChar <> Cr AndAlso e.KeyChar <> Back) Then inputString.Append(e.KeyChar)
  End Sub

  Private Sub OutputBeginRead()
   stdOut.BaseStream.BeginRead(outputBuffer, 0, outputBuffer.Length, AddressOf OnStdOut, Nothing)
  End Sub

  Private Sub ErrorBeginRead()
   stdErr.BaseStream.BeginRead(errorBuffer, 0, errorBuffer.Length, AddressOf OnStdErr, Nothing)
  End Sub

  Private Sub OnStdOut(ByVal result As System.IAsyncResult)
   ' Dump the characters to the text box
   Dim cb As Integer = stdOut.BaseStream.EndRead(result)
   If (cb = 0) Then Return

   Dim s As String = System.Text.Encoding.GetEncoding(866).GetString(outputBuffer, 0, cb).Trim()
   If (s <> String.Empty AndAlso s <> lastCmd) Then Me.AppendTextA("!" & s)

   ' Start another read
   OutputBeginRead()
  End Sub

  Private Sub OnStdErr(ByVal result As System.IAsyncResult)
   ' Dump the characters to the text box
   Dim cb As Integer = stdErr.BaseStream.EndRead(result)
   If (cb = 0) Then Return

   Dim s As String = System.Text.Encoding.GetEncoding(866).GetString(errorBuffer, 0, cb).Trim()
   Me.AppendTextA(s & NewLine & NewLine)

   ' Start another read
   ErrorBeginRead()
  End Sub

  Private Delegate Sub AppendTextDelegate(ByVal Text As String)
  Private Sub AppendTextA(ByVal Text As String)
   If (Me.InvokeRequired) Then
     Me.Invoke(New AppendTextDelegate(AddressOf AppendTextA), Text)
     Return
   End If

   Me.AppendText(Text)
  End Sub

End Class

Colorized by: Eros.CodeSyntaxColor Engine
В OnStdOut вывод "!" был добавлен для проверки кой-чего, не обращаем внимания... Вопрос, собственно, вот в чём: можно ли как-то добиться того, чтобы если в cmd.exe появлялась ошибка, текст из StdErr выводился раньше, чем из StdOut? Просто иногда можно наблюдать такой артефакт:
001:
002:
003:
004:
005:
006:
007:
!Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

D:\Documents\Sacred Phoenix Documents\Programming\Visual Studio 2005\Projects\CmdTextBox\bin\Debug>cd\
!D:\>aa
!D:\>"aa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
вместо ожидаемого
001:
002:
003:
004:
005:
006:
007:
008:
009:
!Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

D:\Documents\Sacred Phoenix Documents\Programming\Visual Studio 2005\Projects\CmdTextBox\bin\Debug>cd\
!D:\>aa
"aa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

!D:\>

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 12 | Автор: EROS
Добавлено:30.08.2007 / 14:28
А это у Вас ,батенька, ручки кривые.. ))))
001:
002:
003:
GetEncoding(866).GetString(outputBuffer, 0, cb).Trim()

Colorized by: Eros.CodeSyntaxColor Engine

Обрезать надо ТОЛЬКО для проверки!!! а добавлять в том виде в каком он был(в полученном.. без всяких изменений.. от же данные из потока не за 1 раз читает, а за несколько..).. ты же этой команды и все переводы строк режешь!! Отсюда у тебя и получаются артефакты "искуственновыращенные" )))
Во вторых ... у тебя стоит в начале If (cb = 0) Then Return какой смысл в следующей проверке If (s <> String.Empty ....?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 13 | Автор: EROS
Добавлено:30.08.2007 / 14:41
Кстати? не забудь исправить багу с Trim в обоих потоках. (stdOut & stdErr) и тогда точно тебе будет счастье.. )))

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 14 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 15:26
А это у Вас ,батенька, ручки кривые.. ))))

Скажите, вы не видели здесь моск? Кажется это был мой... :-)

какой смысл в следующей проверке If (s <> String.Empty ....?

Ну дык пришло, допустим, NewLine. cb = 2. Обрезали Trim()'ом — получилось String.Empty. О куда логика зашла :-)))

* Ушёл исправлять *

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 15 | Автор: EROS
Добавлено:30.08.2007 / 15:36
Ну дык пришло, допустим, NewLine.

Даже если пришло vbNewLine - ты полюбому должен его добавить в окно.. Дабы не нарушать отчетности! :-) (фраза из мультика про Кота Матроскина))))

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 16 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 16:05
Даже если пришло vbNewLine - ты полюбому должен его добавить в окно..

Да теперь-то это понятно :-)

Так, ну что.. Всё почти хорошо. Единственное:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\>aaa

"aaa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
C:\>aaa
"aaa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\>aaa
"aaa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\>
Почему первый раз строчка «"ааа" не является внутренней или внешней...» выводится с NewLine в начале, а последующие разы — всё ок?

Это, конечно, не смертельно, но цепляет :-)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 17 | Автор: EROS
Добавлено:30.08.2007 / 16:16
Окончательный вариант кода в студию...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 18 | Автор: 5acred Phoenix
Добавлено:30.08.2007 / 16:34
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
Imports System.IO
Imports System.Text
Imports System.Diagnostics
Imports Microsoft.VisualBasic.ControlChars

<System.Drawing.ToolboxBitmap(GetType(CmdTextBox), "CmdTextBox")> _
Public Class CmdTextBox

  Inherits System.Windows.Forms.TextBox

  Private cmdProcess As Process = Nothing
  Private stdIn As StreamWriter = Nothing
  Private stdOut As StreamReader = Nothing
  Private stdErr As StreamReader = Nothing
  Private outputBuffer(511) As Byte
  Private errorBuffer(511) As Byte
  Private inputString As New StringBuilder()

  Private lastCmd As String = String.Empty

  Protected Overrides Sub OnCreateControl()
   MyBase.OnCreateControl()

   ' Set control properties
   Me.AcceptsReturn = True
   Me.AcceptsTab = True
   Me.Multiline = True
   Me.BackColor = System.Drawing.Color.Black
   Me.ForeColor = System.Drawing.Color.Lime
   Me.Font = New System.Drawing.Font("Lucida Console", 9, System.Drawing.FontStyle.Regular)

   If (Me.DesignMode) Then Return

   ' Create cmd.exe, turning off the window and redirection i/o to us
   Dim info As New ProcessStartInfo("cmd.exe")
   With info
     .CreateNoWindow = True
     .RedirectStandardError = True
     .RedirectStandardInput = True
     .RedirectStandardOutput = True
     .UseShellExecute = False
   End With
   cmdProcess = Process.Start(info)

   ' Capture i/o
   stdOut = cmdProcess.StandardOutput
   stdErr = cmdProcess.StandardError
   stdIn = cmdProcess.StandardInput
   stdIn.AutoFlush = False ' mcw: was true; see OnKeyDown

   System.Threading.Thread.Sleep(50)

   ' Begin async read on standard error and output
   ErrorBeginRead()
   OutputBeginRead()
  End Sub

  Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
   ' Return MyBase.IsInputKey(keyData)
   Return True
  End Function

  Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
   ' NOTE: Not calling the base...
   ' MyBase.OnKeyDown(e)
   e.Handled = True

   ' mcw: only send printable characters; and explictly flush
   ' when ENTER is pressed
   Select Case (e.KeyCode)

     Case System.Windows.Forms.Keys.Enter

      ' Save last typed command
      lastCmd = inputString.ToString()

      stdIn.WriteLine(inputString.ToString())
      stdIn.Flush()
      inputString = New StringBuilder()

     Case System.Windows.Forms.Keys.Back

      inputString.Remove(inputString.Length - 1, 1)

   End Select
  End Sub

  Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
   ' NOTE: Not calling the base...
   ' MyBase.OnKeyPress(e)
   If (e.KeyChar <> Cr AndAlso e.KeyChar <> Back) Then inputString.Append(e.KeyChar)
  End Sub

  Private Sub OutputBeginRead()
   stdOut.BaseStream.BeginRead(outputBuffer, 0, outputBuffer.Length, AddressOf OnStdOut, Nothing)
  End Sub

  Private Sub ErrorBeginRead()
   stdErr.BaseStream.BeginRead(errorBuffer, 0, errorBuffer.Length, AddressOf OnStdErr, Nothing)
  End Sub

  Private Sub OnStdOut(ByVal result As System.IAsyncResult)
   ' Dump the characters to the text box
   Dim cb As Integer = stdOut.BaseStream.EndRead(result)
   If (cb = 0) Then Return

   Dim s As String = System.Text.Encoding.GetEncoding(866).GetString(outputBuffer, 0, cb)
   If (s.Trim() <> lastCmd) Then Me.AppendTextA(s)

   ' Start another read
   OutputBeginRead()
  End Sub

  Private Sub OnStdErr(ByVal result As System.IAsyncResult)
   ' Dump the characters to the text box
   Dim cb As Integer = stdErr.BaseStream.EndRead(result)
   If (cb = 0) Then Return

   Dim s As String = System.Text.Encoding.GetEncoding(866).GetString(errorBuffer, 0, cb)
   Me.AppendTextA(s)

   ' Start another read
   ErrorBeginRead()
  End Sub

  Private Delegate Sub AppendTextDelegate(ByVal Text As String)
  Private Sub AppendTextA(ByVal Text As String)
   If (Me.InvokeRequired) Then
     Me.Invoke(New AppendTextDelegate(AddressOf AppendTextA), Text)
     Return
   End If

   Me.AppendText(Text)
  End Sub

End Class

Colorized by: Eros.CodeSyntaxColor Engine
Больно не пинать...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 19 | Автор: EROS
Добавлено:30.08.2007 / 22:47
Не знаю... все в порядке.. Запустил твой вариант с диска С (как у тебя).. и тоже все ок..

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\>aaa
"aaa" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\>bbb
"bbb" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\>ccc
"ccc" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\>


точная копия оригинального окна...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 20 | Автор: 5acred Phoenix
Добавлено:31.08.2007 / 09:11
Странно... Ладно, жить-то можно.. Тем более эта бага появляется при вводе первой ошибочной команды. Т. е. имеем, например, следующее:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

D:\Documents\Sacred Phoenix Documents\Programming\Visual Studio 2005\Projects\CmdTextBox\bin\Release>cd\

D:\>cd distrib

D:\Distrib>cd ..

D:\>cd windows

Системе не удается найти указанный путь.
D:\>cd windows
Системе не удается найти указанный путь.


D:\>
И плюс повторяется один раз примерно на сотню-полторы комманд.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Управляемый плугин к QIP Infium | Автор: 5acred Phoenix
Добавлено: 28.08.2007 / 19:26 | ответов: 0 | просмотров: 32

Доброе время суток!

Задумал я извращенское дело :-)
Хочу написать хотя бы простенький плугин к QIP Infium'у. И всё бы да ничего... только пишу на .NET'е :-)

С этим связаны такие проблемы:
1) Нужно из DLL экспортировать функцию CreateInfiumPLUGIN
2) Смогут ли unmanaged интерфейсы, объявленные в SDK, найти своих управляемых «двойников»?

Пункт 1, как ни странно, решился. С помощью некоторых махинаций была выведена на свет управляемая сборка, экспортирующая(!) функцию CreateInfiumPLUGIN.
Инфа была взята здесь: http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

Интересует пункт 2.

Вот SDK, прилагаемый к кипу. Файл u_plugin_info.pas
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
{*************************************}
{                                     }
{       QIP INFIUM SDK                }
{       Copyright(c) Ilham Z.         }
{       ilham@qip.ru                  }
{       http://www.qip.im             }
{                                     }
{*************************************}

unit u_plugin_info;

interface

uses Windows, u_plugin_msg;

const
  QIP_SDK_VER_MAJOR = 1;
  QIP_SDK_VER_MINOR = 2;  

type
  {Plugin info}
  TPluginInfo = record
    DllHandle         : DWord;      //dll instance/handle will be updated by QIP after successful loading of plugin library
    DllPath           : PWideChar;  //this should be updated by plugin library after receiving PM_PLUGIN_LOAD_SUCCESS from QIP
    QipSdkVerMajor    : Word;       //major version of sdk for core compatibility check
    QipSdkVerMinor    : Word;       //minor version of sdk for core compatibility check
    PlugVerMajor      : Word;
    PlugVerMinor      : Word;
    PluginName        : PWideChar;
    PluginAuthor      : PWideChar;
  end;
  pPluginInfo = ^TPluginInfo;

  {Plugin specific options which will be saved in profile}
  TPluginSpecific = record
    Bool1       : Boolean;
    Bool2       : Boolean;
    Bool3       : Boolean;
    Bool4       : Boolean;
    Bool5       : Boolean;
    Bool6       : Boolean;
    Bool7       : Boolean;
    Bool8       : Boolean;
    Bool9       : Boolean;
    Bool10      : Boolean;
    Param1      : DWord;
    Param2      : DWord;
    Param3      : DWord;
    Param4      : DWord;
    Param5      : DWord;
    Param6      : DWord;
    Param7      : DWord;
    Param8      : DWord;
    Param9      : DWord;
    Param10     : DWord;
    Wstr1       : WideString;
    Wstr2       : WideString;
    Wstr3       : WideString;
    Wstr4       : WideString;
    Wstr5       : WideString;
    Wstr6       : WideString;
    Wstr7       : WideString;
    Wstr8       : WideString;
    Wstr9       : WideString;
    Wstr10      : WideString;
  end;
  pPluginSpecific = ^TPluginSpecific;    

  {QIP2Plugin instant message record}
  TQipMsgPlugin = record
    MsgType    : Byte;        //see below, MSG_TYPE_....
    MsgTime    : DWord;       //unix datetime, local time
    ProtoName  : PWideChar;
    SenderAcc  : PWideChar;
    SenderNick : PWideChar;
    RcvrAcc    : PWideChar;
    RcvrNick   : PWideChar;
    MsgText    : PWideChar;
    Blocked    : Boolean;     //received msg blocked by antispam
  end;
  pQipMsgPlugin = ^TQipMsgPlugin;
  
  {QIP gives to plugin this interface}
  IQIPPluginService = interface
    function  PluginOptions(DllHandle: LongInt): pPluginSpecific; stdcall;
    procedure OnPluginMessage(var PlugMsg: TPluginMessage); stdcall;
  end;
  pIQIPPluginService = ^IQIPPluginService;


  {Plugin gives to QIP this interface}
  IQIPPlugin = interface
    function  GetPluginInfo: pPluginInfo; stdcall;
    procedure OnQipMessage(var PlugMsg: TPluginMessage); stdcall;
  end;
  pIQIPPlugin = ^IQIPPlugin;


const
  {Messages qip <-> plugin}
  {All messages "plugin -> qip" have to be with actual PluginMsg.DllHandle parameter}
  {=== Plugin main messages =======}
  PM_PLUGIN_LOAD_SUCCESS    =  1; //qip -> plugin
  PM_PLUGIN_RUN             =  2; //qip -> plugin
  PM_PLUGIN_QUIT            =  3; //qip -> plugin
  PM_PLUGIN_ENABLE          =  4; //qip -> plugin
  PM_PLUGIN_DISABLE         =  5; //qip -> plugin
  PM_PLUGIN_OPTIONS         =  6; //qip -> plugin
  {=== Plugin specific messages ===}
  PM_PLUGIN_SPELL_CHECK     =  7; //qip -> plugin, WParam = PWideChar to checking word, LParam = MissSpelledColor (delphi TColor). Return LParam with own color if needed and Result = True if word misspelled.
  PM_PLUGIN_SPELL_POPUP     =  8; //qip -> plugin, WParam = PWideChar to misspelled word, LParam is PPoint where PopupMenu should be popuped (screen coordinates). Return Result = True to ignore qip default menu popup.
  PM_PLUGIN_SPELL_REPLACE   =  9; //plugin -> qip, WParam = PWideChar to right word which will replace old misspelled word. Qip will return Result = True if misspelled word was successfully replaced.
  PM_PLUGIN_XSTATUS_UPD     = 10; //plugin -> qip, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture will be removed.
  PM_PLUGIN_XSTATUS_GET     = 11; //plugin -> qip, core will return WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture not set by user.
  PM_PLUGIN_XSTATUS_CHANGED = 12; //qip -> plugin, user manually changed custom status picture/text, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture was removed by user.
  PM_PLUGIN_SOUND_GET       = 13; //plugin -> qip, if core returned WParam = True then qip sound enabled else sound disabled.
  PM_PLUGIN_SOUND_SET       = 14; //plugin -> qip, if WParam = True then qip will enable sound else will disable.
  PM_PLUGIN_SOUND_CHANGED   = 15; //qip -> plugin, user manually switched sound On/Off. if WParam = True the sound enabled.
  PM_PLUGIN_MSG_RCVD        = 16; //qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow core accept this msg else message will be IGNORED, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
  PM_PLUGIN_MSG_SEND        = 17; //qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow send this msg else user will not be able to send this message, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
  PM_PLUGIN_SPELL_RECHECK   = 18; //plugin -> qip, rechecks spelling for all message editing boxes
  PM_PLUGIN_MSG_RCVD_NEW    = 19; //qip -> plugin, notifier, qip received new message and its still not read by user. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message periodically (~400 msec) until user will open msg window and read this msg.
  PM_PLUGIN_MSG_RCVD_READ   = 20; //qip -> plugin, notifier, new received message has been read by user and qip core will stop notifing with PM_PLUGIN_MSG_RCVD_NEW message. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message only once after message or event will be read by user.
  //to be continued ...


  {QIP msg types}
  MSG_TYPE_UNK        = $00; //unknown msg type
  MSG_TYPE_TEXT       = $01;
  MSG_TYPE_CHAT       = $02;
  MSG_TYPE_FILE       = $03;
  MSG_TYPE_URL        = $04;
  MSG_TYPE_AUTH       = $05;
  MSG_TYPE_ADDED      = $06;
  MSG_TYPE_SERVER     = $07;
  MSG_TYPE_WEB        = $08;
  MSG_TYPE_CONTACTS   = $09;
  MSG_TYPE_AUTO       = $0A;
  MSG_TYPE_SERVICE    = $0B;
  MSG_TYPE_EMAIL      = $0C;
  MSG_TYPE_OFFMSG     = $0D;
  MSG_TYPE_AUTHREPLY  = $0E;



implementation

end.
Файл u_plugin_msg.pas
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
{*************************************}
{                                     }
{       QIP INFIUM SDK                }
{       Copyright(c) Ilham Z.         }
{       ilham@qip.ru                  }
{       http://www.qip.im             }
{                                     }
{*************************************}

unit u_plugin_msg;

interface

uses Windows;

type
  TPluginMessage = record
    Msg       : DWord;
    WParam    : Integer;
    LParam    : Integer;
    NParam    : Integer;
    Result    : Integer;
    DllHandle : DWord;   //Plugin dll handle, this value have to be always actual if plugin sending msg to qip core!
  end;

implementation

end.
Моя реализация. Stuff.QIP.Infium.SDK.vb
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
Imports System.Runtime.InteropServices

Namespace SacredPhoenix.Stuff.QIP.Infium.SDK

  Public Enum QIP_SDK_VER As Short
   MAJOR = 1
   MINOR = 2
  End Enum

  ' Plugin info
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginInfo
   Public DllHandle As Integer ' dll instance/handle will be updated by QIP after successful loading of plugin library
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public DllPath As String ' this should be updated by plugin library after receiving PM_PLUGIN_LOAD_SUCCESS from QIP
   Public QipSdkVerMajor As Short ' major version of sdk for core compatibility check
   Public QipSdkVerMinor As Short ' minor version of sdk for core compatibility check
   Public PlugVerMajor As Short
   Public PlugVerMinor As Short
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public PluginName As String
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public PluginAuthor As String
  End Structure

  ' Plugin specific options which will be saved in profile
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginSpecific
   Public Bool1, Bool2, Bool3, Bool4, Bool5, Bool6, Bool7, Bool8, Bool9, Bool10 As Boolean
   Public Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 As Integer
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public Wstr1, Wstr2, Wstr3, Wstr4, Wstr5, Wstr6, Wstr7, Wstr8, Wstr9, Wstr10 As String
  End Structure

  ' QIP2Plugin instant message record
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TQipMsgPlugin
   Public MsgType As MSG_TYPE
   Public MsgTime As Integer ' unix datetime, local time
   Public ProtoName As String
   Public SenderAcc As String
   Public SenderNick As String
   Public RcvrAcc As String
   Public RcvrNick As String
   Public MsgText As String
   Public Blocked As Boolean ' received msg blocked by antispam
  End Structure

  ' QIP msg types
  Public Enum MSG_TYPE As Byte
   UNK = &H0
   Text = &H1
   CHAT = &H2
   FILE = &H3
   URL = &H4
   AUTH = &H5
   ADDED = &H6
   SERVER = &H7
   WEB = &H8
   CONTACTS = &H9
   Auto = &HA
   SERVICE = &HB
   EMAIL = &HC
   OFFMSG = &HD
   AUTHREPLY = &HE
  End Enum

  ' QIP gives to plugin this interface
  Public Interface IQIPPluginService
   Function PluginOptions(ByVal DllHandle As Long) As TPluginSpecific
   Sub OnPluginMessage(ByVal PlugMsg As TPluginMessage)
  End Interface

  ' Plugin gives to QIP this interface
  Public Interface IQIPPlugin
   Function GetPluginInfo() As TPluginInfo
   Sub OnQipMessage(ByVal PlugMsg As TPluginMessage)
  End Interface

  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginMessage
   Public Msg As PM_PLUGIN
   Public WParam As Integer
   Public LParam As Integer
   Public NParam As Integer
   Public Result As Integer
   Public DllHandle As Integer ' Plugin dll handle, this value have to be always actual if plugin sending msg to qip core!
  End Structure

  ' Messages qip <-> plugin
  ' All messages "plugin -> qip" have to be with actual TPluginMessage.DllHandle parameter
  Public Enum PM_PLUGIN As Integer
   ' ======= Plugin main messages =======
   LOAD_SUCCESS = 1 ' qip -> plugin
   RUN = 2 ' qip -> plugin
   QUIT = 3 ' qip -> plugin
   ENABLE = 4 ' qip -> plugin
   DISABLE = 5 ' qip -> plugin
   OPTIONS = 6 ' qip -> plugin
   ' ======= Plugin specific messages =======
   SPELL_CHECK = 7 ' qip -> plugin, WParam = PWideChar to checking word, LParam = MissSpelledColor (delphi TColor). Return LParam with own color if needed and Result = True if word misspelled.
   SPELL_POPUP = 8 ' qip -> plugin, WParam = PWideChar to misspelled word, LParam is PPoint where PopupMenu should be popuped (screen coordinates). Return Result = True to ignore qip default menu popup.
   SPELL_REPLACE = 9 ' plugin -> qip, WParam = PWideChar to right word which will replace old misspelled word. Qip will return Result = True if misspelled word was successfully replaced.
   XSTATUS_UPD = 10 ' plugin -> qip, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture will be removed.
   XSTATUS_GET = 11 ' plugin -> qip, core will return WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture not set by user.
   XSTATUS_CHANGED = 12 ' qip -> plugin, user manually changed custom status picture/text, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture was removed by user.
   SOUND_GET = 13 ' plugin -> qip, if core returned WParam = True then qip sound enabled else sound disabled.
   SOUND_SET = 14 ' plugin -> qip, if WParam = True then qip will enable sound else will disable.
   SOUND_CHANGED = 15 ' qip -> plugin, user manually switched sound On/Off. if WParam = True the sound enabled.
   MSG_RCVD = 16 ' qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow core accept this msg else message will be IGNORED, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
   MSG_SEND = 17 ' qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow send this msg else user will not be able to send this message, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
   SPELL_RECHECK = 18 ' plugin -> qip, rechecks spelling for all message editing boxes
   MSG_RCVD_NEW = 19 ' qip -> plugin, notifier, qip received new message and its still not read by user. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message periodically (~400 msec) until user will open msg window and read this msg.
   MSG_RCVD_READ = 20 ' qip -> plugin, notifier, new received message has been read by user and qip core will stop notifing with PM_PLUGIN_MSG_RCVD_NEW message. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message only once after message or event will be read by user.
   ' To be continued...
  End Enum

End Namespace

Colorized by: Eros.CodeSyntaxColor Engine
И файл ExamplePlugin.vb
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
Imports SacredPhoenix.Stuff.QIP.Infium.SDK

Public Class Main
  Public Shared Function CreateInfiumPLUGIN(ByVal PluginService As IQIPPluginService) As IQIPPlugin
   Return New ExampleQIPInfiumPlugin(PluginService)
  End Function
End Class

Public Class ExampleQIPInfiumPlugin
  Implements IQIPPlugin

  Public Const PLUGIN_VER_MAJOR As Short = 1
  Public Const PLUGIN_VER_MINOR As Short = 0
  Public Const PLUGIN_NAME As String = "My QIP Infium Plugin"
  Public Const PLUGIN_AUTHOR As String = "5acred Phoenix"

  Private m_PluginSvc As IQIPPluginService
  Private m_PluginInfo As TPluginInfo
  Private m_DllPath As String
  Private m_UpdatedMsgText As String
  Private m_wStr As String
  Private m_wStatus As String
  Private m_wDescription As String
  Private m_OptionBool1 As Boolean
  Private m_OptionParam2 As Integer

  Public Sub New(ByVal PluginService As IQIPPluginService)
   m_PluginSvc = PluginService
  End Sub

  Public Function GetPluginInfo() As TPluginInfo Implements IQIPPlugin.GetPluginInfo
   Return m_PluginInfo
  End Function

  Public Sub OnQipMessage(ByVal PlugMsg As TPluginMessage) Implements IQIPPlugin.OnQipMessage
   Select Case PlugMsg.Msg
     Case PM_PLUGIN.LOAD_SUCCESS
      ' Dll library was successfuly loaded and FProtoInfo.DllHandle was updated by qip core.
      ' This msg sent always on qip start, even if plugin is disabled in options.

      ' Updating m_PluginInfo only!
      LoadSuccess()

     Case PM_PLUGIN.RUN
      ' Here you can start plugin work, create any forms, objects etc.
      ' Note that if plugin is disabled, it will not receive this message.
      ' Instead of this msg it will receive PM_PLUGIN_ENABLE if user will enable this plugin in options.

      ' Using:
      ' CreateControls()
      ' LoadPluginOptions()

     Case PM_PLUGIN.QUIT
      ' QIP closing, free plugin resources and finish plugin work.

      ' Using:
      ' SavePluginOptions()
      ' FreeControls()

     Case PM_PLUGIN.DISABLE
      ' Plugin was disabled in qip options, after this, this plugin will not receive
      ' any QIP messages (excepting PM_PLUGIN_ENABLE and PM_PLUGIN_QUIT) and
      ' any plugin message to qip core will be ignored, but plugin will stay loaded into memory.
      ' Any connections and forms have to be closed.

      ' Using:
      ' FreeControls()

     Case PM_PLUGIN.ENABLE
      ' The same message like PM_PLUGIN_RUN but when plugin was enabled in
      ' options and after that plugin will start receive messages from QIP.

      ' Using:
      ' CreateControls()
      ' LoadPluginOptions()

     Case PM_PLUGIN.OPTIONS
      ' Open plugin options window if needed.
      ' Hint: You can save 30 different parameters in qip profile dedicated to your plugin using
      '    interface function PluginOptions. For example how to get access to your plugin
      '    options parameters:
      '    var aPluginSpecific: pPluginSpecific;
      '    aPluginSpecific := FPluginSvc.PluginOptions(FPluginInfo.DllHandle);
      '    if Assigned(aPluginSpecific) then aPluginSpecific^.Bool1 := True;

      ' Show messagebox, for example.
      System.Windows.Forms.MessageBox.Show("PM_PLUGIN_OPTIONS message was received.", PLUGIN_NAME, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information)

     Case PM_PLUGIN.SPELL_CHECK
      ' This message is just to test different plugin purposes.

      ' Using:
      ' SpellCheck(PlugMsg)

     Case PM_PLUGIN.SPELL_POPUP
      ' This message is just to test different plugin purposes.

      ' Using:
      ' SpellCheck(PlugMsg)

     Case PM_PLUGIN.XSTATUS_CHANGED
      ' This message is just to test different plugin purposes.
      ' Qip core notifies that xstatus picture/text was changed by user.
      ' Note that this msg will NOT be sent after plugin set own xstatus using PM_PLUGIN_XSTATUS_UPD.

      ' Using:
      ' XStatusChangedByUser(PlugMsg)

     Case PM_PLUGIN.SOUND_CHANGED
      ' This message is just to test different plugin purposes.
      ' Qip core notifies that sound on/of switcher was changed by user.
      ' Note that this msg will NOT be sent after plugin enable/disable sound using PM_PLUGIN_SOUND_SET.

      ' Using:
      ' QipSoundChanged(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD
      ' This message is just to test different plugin purposes.
      ' Message received notifier.

      ' Using:
      ' InstantMsgRcvd(PlugMsg)

     Case PM_PLUGIN.MSG_SEND
      ' This message is just to test different plugin purposes.
      ' Message is going to be sent notifier.

      ' Using:
      ' InstantMsgSend(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD_NEW
      ' This message is just to test different plugin purposes.
      ' New instant message received and its not read by user, its still flashing.
      ' This message will be send periodically (~400 msec) until user will read new message.

      ' Using:
      ' NewMessageFlashing(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD_READ
      ' This message is just to test different plugin purposes.
      ' New instant message has been read by user, flashing stopped.

      ' Using:
      ' NewMessageStopFlashing(PlugMsg)

   End Select

   ' Simple messages logging
   ' if Assigned(FfrmTest) then FfrmTest.Memo1.Lines.Add('Plugin MsgID: ' + IntToStr(PlugMsg.Msg));
  End Sub

  Private Sub LoadSuccess()
   With m_PluginInfo
     .DllPath = System.Reflection.Assembly.GetExecutingAssembly().Location
     .QipSdkVerMajor = QIP_SDK_VER.MAJOR
     .QipSdkVerMinor = QIP_SDK_VER.MINOR
     .PlugVerMajor = PLUGIN_VER_MAJOR
     .PlugVerMinor = PLUGIN_VER_MINOR
     .PluginName = PLUGIN_NAME
     .PluginAuthor = PLUGIN_AUTHOR
   End With
  End Sub
End Class

Colorized by: Eros.CodeSyntaxColor Engine
Реально ли заставить всё это пахать? :-)

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Наверх

 

Последние статьи

Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)
Автор: Немиро Алексей | добавлено: 27.07.2007 / 14:01 | просмотров: 579

В данной статье речь пойдет о том, как можно программно заполнить и отправить Web-форму, а также получить результат с использованием довольно простых классов - HttpWebRequest и HttpWebResponse.

Работа с SQL – Запросы
Автор: Хабибулин А. (aka Bille Gates) | добавлено: 22.07.2007 / 04:43 | просмотров: 982

В данной статье рассмотрены часто используемые SQL-запросы и приведены примеры их использования.

Использование XML.Serialization
Автор: Немиро Алексей | добавлено: 19.07.2007 / 15:38 | просмотров: 249

В данном обзоре речь пойдет об использование XML.Serialization в .NET и ее применении на примере сохранения и считывания настроек программы с использованием синтаксиса языка Visual Basic .NET.

Выбор языка программирования для научных работ (2-я редакция)
Автор: Юдин С. Ю. | добавлено: 15.03.2007 / 02:49 | просмотров: 2019

Идея написания этой статьи возникла после того, как на одном из сайтов по физике http://physics.nad.ru/aniboard/messages/291.html я обнаружил интересный алгоритм моделирования движения тела в поле постоянной напряженности по различным направляющим. Вернее, меня заинтересовал не весь алгоритм, т.к. основа их всех одна (принцип Даламбера, если не считать квазиалгоритма с применением уравнений Лагранжа 2-го рода) и различаются они только способом определения реакций в месте соприкосновения тел. ...

Работаем с MIME
Автор: Немиро Алексей | добавлено: 29.11.2006 / 14:46 | просмотров: 1960

Не так давно мне пришлось немного поработать MIME (Multipurpose Internet Mail Extension) - это стандарт почтовых сообщений, в РуНете (Russian Internet) я не нашел нормального описания спецификации MIME, и посему решил написать небольшую статейку на эту тему. В данной статье вы узнаете об основных особенностях и стандартах MIME, а также научитесь «читать» MIME с использованием синтаксиса языка Visual Basic .NET 2005.

 

Статьи на Kbyte.Ru

Наверх

 

Интересные коды и решения

Как изменить раскладку клавиатуры (Ru-En-Du ...)?
Дата добавления: 16.08.2006 / 19:44 | просмотров: 625 | платформа: VB

Поиск и замена
Дата добавления: 16.08.2006 / 18:54 | просмотров: 758 | платформа: VB

Как программано выровнить форму по центру экрана?
Дата добавления: 23.08.2006 / 18:59 | просмотров: 817 | платформа: VB .NET

Как можно скрыть курсор мышки?
Дата добавления: 16.08.2006 / 19:48 | просмотров: 526 | платформа: VB

Удаление куков (Cookies)
Дата добавления: 31.07.2006 / 15:57 | просмотров: 638 | платформа: ASP .NET (VB)

Удаление куков (Cookies)
Дата добавления: 01.08.2006 / 12:04 | просмотров: 716 | платформа: ASP

Поиск слов определенной длины
Дата добавления: 24.03.2007 / 11:02 | просмотров: 372 | платформа: RegEx

Как получить данные из базы данных?
Дата добавления: 31.07.2006 / 18:31 | просмотров: 616 | платформа: ASP

Как запретить запуск двух копий программы?
Дата добавления: 04.08.2006 / 08:53 | просмотров: 651 | платформа: VB

Класс доступа к данным SQL Server
Дата добавления: 24.03.2007 / 11:48 | просмотров: 308 | платформа: VB .NET

 

Универсальные коды на Kbyte.Ru

Наверх

 

Юмор на Kbyte.Ru

Чтобы в лесу узнать, где север, нужно посмотреть на дерево. Если это дерево - пальма, то юг уже здесь.

 

Рейтинг: 98
Всего голосов: 161
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Человеку свойственно ошибаться, и он пользуется этим свойством часто и с удовольствием

 

Рейтинг: 118
Всего голосов: 165
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Вольво цепляет на пеpекpестке джип. Все останавливаются, из джипа
вываливают pебята в споpтивной фоpме и подходят к водителю Вольво.
- Hу все мужик, ты попал! Пpодавай машину, пpодавай кваpтиpу,
с тебя деньги!
- Ребята, а кто вы такие?
- Мы? - удивленно - Мы споpтсмены!
Мужик достает пистолет и, заpяжая его:
- Hу тогда HА СТАРТ! ВHИМАHИЕ! .....

 

Рейтинг: 67
Всего голосов: 102
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Компьютерный магазин, заходит женщина лет 45. Дальше наш с ней диалог.
Покупательница: Мне видеокарта нужна, у меня игрушки не открываются.
Я: Тормозят?
Покупательница: Вообще не открываются.
Я: Видеокарта, какая у вас?
Покупательница: А я откуда знаю. Intel какая-то.
Я: Паспорт от материнской платы у вас есть?
Покупательница: А мне там всё наши программисты поменяли, у меня там всё сгорело, и у меня компьютер раньше горизонтально стоял, а теперь вертикально.
Я: «Вам корпус, что ли, поменяли?
Покупательница: Да.
Я: А что сгорело? Материнская плата сгорела?
Покупательница: «А я откуда знаю».
Я: Мне надо знать, какая у вас материнская плата. Чтобы я мог сказать, какая вам видеокарта подойдёт.
Покупательница: «Вот мне тут наши программисты написали».
Достаёт бумажку на ней написано Intel Controller graphics.
Я: У вас интегрированная графика. У вас должен быть порт для видеокарты на материнской плате, если он есть, вы можете купить видеокарту и установить её в этот порт.
Покупательница: А можно этот интегрированный контроллер вытащить и на его место видеокарту поставить?

 

Рейтинг: 122
Всего голосов: 136
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

- Какие животные живут в тундре?
- Песцы, куропатки и наш папа, который ездит туда в командировку.

 

Рейтинг: 106
Всего голосов: 150
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

В разгаре "Поле Чудес". Якубович: - Очередь вращать барабан переходит к Биллу Гейтсу. Последний вращает барабан и вырывает микрофон из рук Якубовича. - Пользуясь случаем, хочу передать привет от Биллла Гейтса... В этот момент на экранах телезрителей вываливается знакомое изображение GРF и, после непродолжительной паузы, телевизоры выходят из строя...

 

Рейтинг: 139
Всего голосов: 161
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Отец Вовочки на родительском собрании:
- Ну что ж поделаешь, Вовочке в одно ухо влетело, в другое вылетело...
Учитель физики со своего места:
- Ошибаетесь, звук в вакууме не распространяется...

 

Рейтинг: 131
Всего голосов: 191
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Учительница:
- Дети, напишите стих чтобы была половина Пушкина а половина ваша.
Вовочка:
- Я &бал ее шутя
Груди девичьи крутя.
Училка:
- Вовочка, а где же Пушкин??
- То как зверь она завоет
То заплачет как дитя.

 

Рейтинг: 80
Всего голосов: 77
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Это поyчительная истоpия о пользе знания сленговых выpажений в общении с пpостыми смеpтными, кои компьютеp видели лишь по TV...
Итак, идy по yлице, подходит гpyппа молодых людей, лет 17-18 от pодy, пpосят закypить... Я, как человек давно кypящий, отказать не могy, а посемy yделяю им паpочкy Camel-ов... Далее пpосят спичкy... Щелкаю Zippo-ой... Пpосят денег на доpогy до дома 8-(..)
(Они) - Ты, в натypе, чо, денег дашь?
(Я) - А зачем вам деньги ? :)
(О) - Ты чо, в натypе, Вася, обоpзел?
(Я) - Ты кого за мастдай юзаешь, ламеp виснyтый?
(О) - лица вытягиваются...
(Я) - Вы же меня анноите, сyкси...
(О) - Hy ты чего, мyжик, офигел?
(Я) - Я ведь сейчас Фаpидy нетмейл кинy, вы ведь все в пожизненный даyн осыпетесь, как девяносто пятый...
(О) - Hе, бpатан, давай pазбеpемся, кто ты такой? 8-()
(Я) - Мальчики, я ФИДОшный поинт, а вы даже на блевавщиков не тянете, только скpипите чего-то на две четыpеста без коppекции...
(О) - Чего делаем 8-(.............)
(Я) - Скpипите, пpичем без намека на коннект...
(О) - Ты чего, кpyтой?
(Я) - Схэнг-апнись, бага... Твое место - за тысячной Амигой...
(О) - Hе, нy ты чо? Hет денег, так и скажи, а чо наезжать-то????
(Я) - А еще pаз yвижy вас здесь, комплейн напишy NEC-y, и пpо вас и поинты ваши забyдyт... Тискайте альт-аш и pвите отседа.......

Hе скажy, что yбежали, но двигались не в пpимеp шyстpее, нежели ко мне... Так что yчите спец. словечки, кpyто, в натypе... :)))))

 

Рейтинг: 122
Всего голосов: 187
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Учительница повела детей в лес на экскурсию. И вдруг говорит:
- Смотрите, дети, кого я нашла! Кто это весь в иголках?
- Не знаем.
- Вспомните, мы про него песни пели и стихотворения учили.
- Ах вот ты какой, дедушка Ленин!

 

Рейтинг: 419
Всего голосов: 590
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Весь юмор на Kbyte.Ru

Наверх


Выпуск подготовил: R-KDR-19826

Редактор: Немиро Алексей

Copyright (c) Nemiro AS, 2005-2007


В избранное