![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Net Send по заданному адресу [D7, WinXP]
ronyn © (2005-08-16 00:36:00)NetSend('text Messages', ip_address,...) примерно так, если правильно помню. Так вот, надо , чтобы IP был например равен Edit1.Text. Как это сделать?
Leonid Troyanovsky (2005-08-18 09:07:00) [1]
> KilkennyCat © (18.08.05 02:05) [5]
> http://delphibase.spb.ru/?action=viewbook&book=10417&topic=netlan
В 9х можно слать сообщение через NETMESSAGEBUFFERSEND
из netapi.dll (16 битной). Т.е., через thunk.
См., например,
http://groups-beta.google.com/group/fido7.ru.delphi/msg/d0f74710d8fc6131
--
Regards, LVT.
Leonid Troyanovsky (2005-08-18 09:01:00) [2]
> ronyn (18.08.05 00:28) [4]
> Интересно получается, один предлагает код величиной в строку,
> другой величиной в 30 строк. Тоже самое было с громкостью
> TMediaPlayer. В чем же здесь прикол? Зачем писать такой
> код если есть одна строка?!
Первый вариант вызывает внешнюю программу net.exe,
а второй - непосредственно функцию NetApi32.dll.
Во втором случае контроль за происходящим больше,
да и возможностей у этой функции поболее, например,
с ее помощью можно отправить сообщения с другого
компьютера, если, скажем, messenger на локальной машине
не пущен. Правда, код будет немного другим.
Кстати, и приведенный вариант можно сделать короче:
procedure NetSend(const AMessage, AToComputer: WideString);
var
NetApi32: HMODULE;
NetMessageBufferSend: function (ServerName, ToName, FromName: PWideChar;
Buffer: PWChar; BufLen: DWORD): DWORD stdcall;
begin
NetApi32 := LoadLibrary('NetApi32.dll');
if NetApi32 <= HINSTANCE_ERROR then
raise EOSerror.CreateFmt('LoadLibrary error %d',[GetLastError]);
NetMessageBufferSend := GetProcAddress(NetApi32, 'NetMessageBufferSend');
try
Win32Check(Assigned(NetMessageBufferSend));
if NetMessageBufferSend( nil,
PWideChar(AToComputer),
nil,
PWideChar(AMessage),
Length(AMessage) * SizeOf(WideChar)) <> 0 then
raise EOSError.CreateFmt('Net API error %d',[GetLastError]);
finally
FreeLibrary(NetApi32);
end;
end;
--
Regards, LVT.
KilkennyCat (2005-08-18 02:05:00) [3]
> [4] ronyn (18.08.05 00:28)
хороший вопрос.
http://delphibase.spb.ru/?action=viewbook&book=10417&topic=netlan
> [2] Leonid Troyanovsky © (16.08.05 08:59)
спасибо за пояснения.
ronyn (2005-08-18 00:28:00) [4]Интересно получается, один предлагает код величиной в строку, другой величиной в 30 строк. Тоже самое было с громкостью TMediaPlayer. В чем же здесь прикол? Зачем писать такой код если есть одна строка?!
Lamer@fools.ua (2005-08-16 09:14:00) [5]
function NetSend(const AMessage, AToComputer: AnsiString): LongWord;
type
TNetMessageBufferSend = function (ServerName, ToName, FromName: PWideChar;
Buffer: Pointer; BufLen: DWORD): LongWord stdcall;
var
NetApi32: HMODULE;
NetMessageBufferSend: TNetMessageBufferSend;
MessageW, ToComputerW: WideString;
begin
Windows.SetLastError(NO_ERROR);
NetApi32 := LoadLibrary('NetApi32.dll');
if NetApi32 <= HINSTANCE_ERROR then
begin
Result := Windows.GetLastError;
Exit;
end;
try
NetMessageBufferSend := GetProcAddress(NetApi32, 'NetMessageBufferSend');
if @NetMessageBufferSend = nil then
begin
Result := ERROR_INVALID_FUNCTION;
Exit;
end;
MessageW := WideString(AMessage);
ToComputerW := WideString(AToComputer);
Result := NetMessageBufferSend(nil, PWideChar(ToComputerW), nil,
PWideChar(MessageW), Length(MessageW) * SizeOf(WideChar));
finally
FreeLibrary(NetApi32);
end;
end;
Leonid Troyanovsky (2005-08-16 08:59:00) [6]
> KilkennyCat © (16.08.05 00:41) [1]
> winexec('net send ' + adr + ' ' + mesg, sw_hide)
PChar('net send ' + adr + ' ' + mesg).
Кроме того, нет нужды в передаче PChar instead String.
Ну, и удобней пользовать функцию Format, например:
resourcestring
rsNetsendAddrMsg = 'net send %s %s';
..
.. := Format(rsNetsendAddrMsg, [Adr, Msg])
--
Regards, LVT.
KilkennyCat (2005-08-16 00:41:00) [7](с) La Mer
procedure netsend(adr: pchar; mesg: pchar);
begin
winexec('net send ' + adr + ' ' + mesg, sw_hide)
end;