- Details
- Written by: Stanko Milosev
- Category: Delphi
- Hits: 4569
If you are having problems after you installed components, like:
File not found *.dcu, or *.pas, try adding path to Tools->Options->Library - Win32 -> Library path
- Details
- Written by: Stanko Milosev
- Category: Delphi
- Hits: 5778
Now, little bit about MAPI.
According to wikipedia MAPI is designed to be independent of the protocol, it is usually used with MAPI/RPC, the proprietary protocol that Microsoft Outlook uses to communicate with Microsoft Exchange. So, I read this like MAPI is a protocol.
To use MAPI you will need MS Outlook MS Exchange or MS Exchange client, which you can download from here, installed on machine.
There are two kind of MAPI, simple MAPI and extended MAPI.
According to Microsoft most of functions of simple MAPI are deprecated, so I focus here on extended MAPI.
Again, according to Microsoft exended MAPI can be difficult to learn.
For Delphi you can use Easier Extended MAPI, like it is described here, but that was also too difficult to learn, too much time I will need, so I found RapWare Easy MAPI components, which completely satisfy me.I don't think that I need to write too much about them, since they have very good examples about everything.
- Details
- Written by: Stanko Milosev
- Category: Delphi
- Hits: 5914
One note to my self, this is piece of code which I was using for starting application from command prompt and getting an information, was that succesfull or not.
function CaptureConsoleOutput(DosApp : string; var strLog : String): Boolean;
const
ReadBuffer = 1048576;ĂÂ // 1 MB Buffer
var
Security: TSecurityAttributes;
ReadPipe,WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
TotalBytesRead,
BytesRead: DWORD;
Apprunning,n,
BytesLeftThisMessage,
TotalBytesAvail : integer;
xCode: Cardinal;
bolOk: Boolean;
begin
bolOk := False;
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
begin
// Redirect In- and Output through STARTUPINFO structure
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
start.hStdError := WritePipe;
// Create a Console Child Process with redirected input and output
if CreateProcess(nil, PChar(DosApp),
@Security,@Security,
true, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,
nil, nil,
start, ProcessInfo) then
begin
n:=0;
TotalBytesRead:=0;
repeat
// Increase counter to prevent an endless loop if the process is dead
Inc(n,1);
// wait for end of child process
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
// it is important to read from time to time the output information
// so that the pipe is not blocked by an overflow. New information
// can be written from the console app to the pipe only if there is
// enough buffer space.
if not PeekNamedPipe(ReadPipe ,@Buffer[TotalBytesRead],
ReadBuffer, @BytesRead,
@TotalBytesAvail,@BytesLeftThisMessage) then break
else if BytesRead > 0 then
ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
TotalBytesRead:=TotalBytesRead+BytesRead;
until (Apprunning <> WAIT_TIMEOUT) or (n > 150);
GetExitCodeProcess(ProcessInfo.hProcess,xCode);
if xCode=0 then
bolOk := True
else
bolOk := False;
Buffer[TotalBytesRead]:= #0;
OemToChar(Buffer,Buffer);
strLog := strLog + StrPas(Buffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
Result := bolOk;
end;
end;