Autor Beitrag
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 08.07.03 23:02 
Grade verfaßt. Ist hiermit PUBLIC DOMAIN.

Die Funktionalität entspricht in etwa der von NetMessageBufferSend().

NetMessageBufferSend() macht mehr Parameterchecks und ruft dann implizit NdrClientCall2() auf. Das Prinzip beim Senden ist in etwa gleich, nur, daß man NetMessageBufferSend() nur auf der NT-Plattform zur Verfügung hat, aber dieser Code eben auch von 9x/Me aus funktionieren würde.

Außerdem sind die Parameter an Delphi angepaßt worden ... und ich habe ansatzweise asynchrones Senden mit reingebaut. Man könnte also eine Verbindung öffnen, das Handle in ein Array packen und dann den Schreibvorgang asynchron von Windows durchführen lassen. Währenddessen kann man schon den nächsten Sendevorgang anstossen.

ausblenden volle Höhe Delphi-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:
function NetMessageBufferSendSubstA(ServerName, MsgName, FromName, Msg: AnsiString): Boolean;
{.$DEFINE SYNCHRONOUS}
const
  szService = '\mailslot\messngr';
  MaxBufLen = $700;
var
  hFile: THandle;
  WrittenBytes: DWORD;
{$IFNDEF SYNCHRONOUS}
  ovs: OVERLAPPED;
  EventName:String;
{$ENDIF}
begin
  Result := False;
  if Length(Msg) > MaxBufLen then
    SetLength(Msg, MaxBufLen);
{$IFNDEF SYNCHRONOUS}
  EventName:='NetSendEvent_'+ServerName;
{$ENDIF}
  ServerName := '\\' + Servername + szService;
  hFile := CreateFileA(
    @ServerName[1], GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_OVERLAPPED, 0);
  if hFile <> INVALID_HANDLE_VALUE then
  try
    Msg := FromName + #0 + MsgName + #0 + Msg;
{$IFNDEF SYNCHRONOUS}
    ovs.hEvent := CreateEventA(nil, True, False, @EventName[1]);
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, @ovs);
    Result := GetLastError = ERROR_IO_PENDING;
{$ELSE}
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, nil);
    Result := GetLastError = ERROR_SUCCESS;
{$ENDIF}
  finally
{$IFNDEF SYNCHRONOUS}
    if WaitForSingleObject(ovs.hEvent, INFINITE) <> WAIT_TIMEOUT then
{$ENDIF}
      CloseHandle(hFile);
  end;
end;


Zuletzt bearbeitet von Gast am Mi 09.07.03 10:09, insgesamt 1-mal bearbeitet
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!