Форум: "Потрепаться";
Текущий архив: 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.044 c