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

Вниз

PopUp   Найти похожие ветки 

 
SammIk ©   (2004-05-02 20:12) [0]

Поскольку сдесь часто задают вопрос: как отправить сообщение
по локальнои сети(net send)?
Решил написать маленькии пример.
Написан он на API. Преведены два способа отсылки сообщении:
1 маилслоты
2 NetMessageBufferSend
Также будет полезен тем кто хочет отказаться от делфовых
форм и компанент.
С уважением Я.
Если наидете ошибки(что врятли, хотя писал 20 минут), буду
рад если вы мне о них сообщите.
http:\\logid.narod.ru\PopUp.zip
PS: Клодовка не работает, по этому пишу сюда


 
Anatoly Podgoretsky ©   (2004-05-02 20:24) [1]

http://logid.narod.ru/PopUp.zip
Вот так лучше


 
Rouse_ ©   (2004-05-02 20:29) [2]

Не проверял еще, пока нет времени - но одна просьба, причеши немного код... крайне неудобно читается...


 
SammIk ©   (2004-05-03 08:04) [3]

Ок, код рабочии.
Причешим, прилижем и подпишем))
Через NetMessageBufferSend на локальном компе будет работать, а через слоты нет, учтите это).


 
SammIk ©   (2004-05-03 08:05) [4]

А когда будет работать клодовка?


 
SammIk ©   (2004-05-03 08:46) [5]

Обновил:
Добавил исчерповающие коментарии.
Буду рад выслушать конструктивную критику))
Фаил качать от тудаже


 
Aldor ©   (2004-05-03 13:09) [6]

В коде затронуто очень много тем, касающихся не только отправки сообщений: погрузка dll, создание окон на API и.т.д. Наверное, было бы очень полезно рассказать обо всем этом.

К тому же, поскольку этот пример для обучения, то код должен быть максимально грамотным, поэтому:

Оформление:
1. Если Вы пишете комментарии, то лучше писать их на одном языке - на русском или английском. Я понимаю, что некоторые куски кода просто скопированы из других мест, но лучше все же их привести к одному виду

2. Сделайте, наконец, выравнивание. Код невозможно читать.

3. Пожалуйста, обзовите переменные по другому. Вот например, что озаначают эти:
  b1, b2, b3, e1, e2, e3, e3_, e2_, e1_, e3c, e2c, e1c, mc, m, fn, mes ?

По сути:
 4. Если Вы пишете функции NetSend: Bool, send_mail_slot: Bool,  то лучше их офомлять именно как независимые от всего "внешнего" функции, параметрами для которых будут "кому", "от кого"  и т.д. У Вас же прямо в телах этих функций происходит ввод из элементов управления окна.
 Вот посмотрите, у Вас в обоих функциях одинакоый код:
 
 e2_:=VirtualAlloc(0,1024,MEM_COMMIT,PAGE_READWRITE);
 e3_:=VirtualAlloc(0,1024,MEM_COMMIT,PAGE_READWRITE);
 m:=VirtualAlloc(0,1024,MEM_COMMIT,PAGE_READWRITE);
 fn:=VirtualAlloc(0,1024,MEM_COMMIT,PAGE_READWRITE);
 mes:=VirtualAlloc(0,1024,MEM_COMMIT,PAGE_READWRITE);
 FillMemory(e2_,1024,0);
 FillMemory(e3_,1024,0);
 FillMemory(m,1024,0);
 FillMemory(mes,1024,0);
 e2c:=getwindowtext(e2,e2_,40);
 e3c:=getwindowtext(e3,e3_,40);
 mc:=getwindowtext(memo,m,1000);
 

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

 5. Я не понял вот этого:

 i:= NetMessageBufferSend(nil, wTo,from_, PBYTE(wMessage), (mc + 1) * sizeof(WideChar));
 Result:= i = ERROR_SUCCESS;
 

 Вы специально вводили переменную i для этого случая, да еще и с таким осмысленным названием?
 Вы не подумайте, я не придираюсь, просто здесь действительно лучше написать:
 
 Result :=  NetMessageBufferSend(nil, wTo, from_, PBYTE(wMessage), (mc + 1) * sizeof(WideChar)) = ERROR_SUCCESS;
 


 6. Еще вот здесь:

hLib:= LoadLibrary("NetApi32.dll");
 hLib1:= LoadLibrary("ole32.dll");
if (hlib > 0)or(hlib1>0) then  ...

 Почему or??! У Вас же в дальнейшем коде используются обе библиотеки!
 
 7. И здесь, объясните, пожалуйста:

hwnd_:=CreateWindowEx(WS_EX_LEFT or WS_EX_TOOLWINDOW,pchar(pc),pchar(na),
                           WS_OVERLAPPEDWINDOW,
                           10,10,500,250,
                           0,0,hInst,nil);

//SetMenu(hWnd_,LoadMenu(hInst,windows.IDC_ICON));// menu ID
getlasterror;
ShowWindow(hWnd_,SW_SHOWNORMAL);
UpdateWindow(hWnd_)  

 Зачем здесь getlasterror? А если ошибка все-таки была, то почему тогда после без всяких проверок работаете с hwnd_

 8. Вы везде используете 0 вместо nil. Компилятор выдает кучу варнингов.

 9.  Вы пишете:
 
 fh:DWORD;//Хендл фаила
 ...
 fh:=CreateFileA(fn,GENERIC_WRITE, FILE_SHARE_READ, NiL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if fh<>-1 then begin
 

 Во-первых, вы сравниваете беззнаковое число с -1,  а во-вторых, значение, возвращаемое CreateFileA лучше  сравнивать с INVALID_HANDLE_VALUE

 10. Return value of function "send_mail_slot" might be undefined
  Не во всех ветках вы прописываете возвращаемое значение

 11. Return value of function "wndproc" might be undefined
  The same

 12. Variable "ps" is declared but never used in "wndproc"
 13. Variable "r" is declared but never used in "wndproc"
  Все-таки эти переменные лучше уж тогда не объявлять, если Вы их не используете.

 С уважанием.


 
SammIk ©   (2004-05-03 13:34) [7]

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

>1Вырезал тока из мсдн, поэтому на инглеше есть пару срок.
>2 Сделал
>3 Думал что так понятно будет, если нет то позже перепишу
>4 Если вам так охото, изменю по вашему желанию))
>5 i а хз, вырезал из своеи старои проги, писал давно, зачемно там ее использовал.
>6 Если какая-нить не загрузится, то это равносильно можно считать провало, следовательно вышли из ф-ии.
>7 Для отладки, забыл вырезать
>8-9 Я вообще на асме пишу, а для него это одно и тоже
Сори за то, что борляндскии синтаксис кое где не использую
борляндскии синтаксис.
А -1 и будет то самое INVALID_HANDLE_VALUE  -1($FFFFFFFF)
> 12-13 Вы полностью правы, хотел сделать красивое окошко, потом передумал. И забыл вырезать эти переменные.
>10 Везде где надо она возвращает, но впринципе можно
ради приличия вставить xor eax,eax;push eax; в WM_CLOSE


 
SammIk ©   (2004-05-03 13:34) [8]

Спасибо учту на будующие))


 
Aldor ©   (2004-05-04 15:09) [9]

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


if (hlib > 0)or(hlib1>0) then
 try
   @NetMessageBufferSend:= GetProcAddress(hLib, "NetMessageBufferSend");
   @CoTaskMemAlloc:= GetProcAddress(hLib1, "CoTaskMemAlloc");
...


 Вы же внутри if используете обе библиотеки, если одна из них не открылась надо об этом честно сообщить ползователю.
 Более общо, исключения все же лучше обрабатывать. Пользователь всегда (ну или максимально возможно "всегда") должен знать почему вывалилась программа.
 Если обработать все ошибки, код станет максимально грамотным.

   Удачи!



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

Форум: "Потрепаться";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.032 c
1-1083840220
bezpal
2004-05-06 14:43
2004.05.23
Динамическая структура дерево в Delphi


14-1083235446
Карелин Артем
2004-04-29 14:44
2004.05.23
Где найти говорящую бутылку водки?


1-1083916381
Saturn
2004-05-07 11:53
2004.05.23
Поиск Файла


1-1083940363
Sirruf
2004-05-07 18:32
2004.05.23
Минимизация главной формы


1-1083765570
Sergo742
2004-05-05 17:59
2004.05.23
Некорректное удаление компонента





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский