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.
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;
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; |