Entwickler-Ecke

Windows API - befehl einbinden


me_Max - So 17.11.02 18:57
Titel: befehl einbinden
folgendes problem:

auf einen buttonklick hin soll über die eingabeaufforderung per 'net send' eine nachricht an einen empfänger geschickt werden.
nachricht steht in edit1.text
empfänger steht in edit2.text

nur kenne ich den befehl nicht, habe ihn mir so vorgestellt:

net send 'edit2.text' 'edit1.text'

ungefähr richtig?


danke im vorraus!

Max


tommie-lie - So 17.11.02 19:10

ich kenn' zwar nicht die syntax von net sent, aber mit Anfürhungszeichen ist's garantiert falsch. Dann wäre nämlich der Text edit1.text und nicht der Inhalt von edit1. Wenn dann müsstest du also die Anführungszeichen weglassen. Wenn du den Befehl mit ShellExecute aufrufst, müsste es so in etwa richtig sein.
Wie hast du den vor, net sent aufzurufen? Ist das nicht ein WinNT-Commandozeilen-Befehl, wenn ich mich richtig erinnere?


Delete - So 17.11.02 19:55

Auf meiner HP findest du so was mit Source.

Alternativ kannst du es auch mit Shellexecute mache, wobei net das p
Programm ist und alles was da nach kommt die Parameter sind. Zu Shellexecute dürftest du hier im Forum fündig werden. Steht, glaube ich, auch was in den FAQ's dazu.


me_Max - So 17.11.02 19:58

ja, das ist es (commandozeilenbefehl). die ' ' weglassen ist klar, wollte das nur hervorheben, mir geht es jetzt um den befehl. er soll cmd starten und dann den befehl (net send * *) darin ausführen. wie kennt delphi(6) die cmdzeile? wie kann man sie einbinden. über neu>konsolenanwendung funktioniert es auch nicht.

Max


Delete - So 17.11.02 20:16

Such mal nach Shellexecute hier im Forum!!! Das amcht alles für dich.


me_Max - So 17.11.02 21:15

ok

ich benutze folgenden befehl:

WinExec(PChar('net send (e) (a)'),SW_SHOWNA);

(e) soll die ip sein, die in edit2.text steht;
(a) soll die nachricht sein, die in edit1.text steht.

bei der ip sagt er mir immer 'gleichkommazahlfehler', habe real, float, curreny.. alles ausprobiert, komme da nicht weiter.
es soll dann so laufen:
statt (e) soll er die ip aus edit2.text,
statt (a) soll er die nachricht aus edit1.text nehmen.
(e) und (a) sollen variablen sein.
bsp: in edit2 steht 192.168.0.1
in edit1 steht hallo
befehl: net send 192.168.0.1 hallo

kann mir jemand beim code helfen?
wäre nett...

Max


Delete - So 17.11.02 21:25

Das muß alles ein String sein.

Hast du mal nach Shellexecute gesucht? :roll:
Oder dir mal mein Net Send angekuckt?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
function NetSendMsg(dest, Source, Msg: string): Longint;
type
  TNetMessageBufferSendFunction = function(servername, msgname, fromname: PWideChar;
    buf: PWideChar; buflen: Cardinal): Longint;
  stdcall;
var
  NetMessageBufferSend: TNetMessageBufferSendFunction;
  SourceWideChar: PWideChar;
  DestWideChar: PWideChar;
  MessagetextWideChar: PWideChar;
  Handle: THandle;
begin
  { erforderliche DLL laden }
  Handle := LoadLibrary('NETAPI32.DLL');
  if Handle = 0 then
  begin
    Result := GetLastError;
    Exit;
  end; @NetMessageBufferSend := GetProcAddress(Handle, 'NetMessageBufferSend');
  if @NetMessageBufferSend = nil then
  begin
    Result := GetLastError;
    Exit;
  end;

  MessagetextWideChar := nil;
  SourceWideChar      := nil;
  DestWideChar        := nil;

  try
    { Speicher anfordern für Nachricht }
    GetMem(MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
    GetMem(DestWideChar, 20 * SizeOf(WideChar) + 1);
    { String umwandlen }
    StringToWideChar(Msg, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
    StringToWideChar(Dest, DestWideChar, 20 * SizeOf(WideChar) + 1);
    { kein Absender }
    if Source = '' then
      Result := NetMessageBufferSend(nil, DestWideChar, nil,
        MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1)
    else
    begin
      { ansonsten Speicher für Absender anfordern }
      GetMem(SourceWideChar, 20 * SizeOf(WideChar) + 1);
      { String umwandeln }
      StringToWideChar(Source, SourceWideChar, 20 * SizeOf(WideChar) + 1);
      { senden }
      Result := NetMessageBufferSend(nil, DestWideChar, SourceWideChar,
        MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
      { Speicher freigeben }
      FreeMem(SourceWideChar);
    end;
  finally
    { Speicher freigeben }
    FreeMem(MessagetextWideChar);
    { DLL freigeben }
    FreeLibrary(Handle);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  NetSendMsg('127.0.0.1', '', 'Hello World');
end;


me_Max - So 17.11.02 21:54

habe danach gesucht und das bsp winexec schien mir am sinnvollsten/einfachsten.

dein script ist richtig gut, n1

big thx

Max