Windows
Windows..........................................................................3
...................................................................................................................3
, .....................................................................3
, ...........................................................................4
- APC.........7
...........................................................................................................8
Event ().......................................................................................................................8
Mutex (Mutually Exclusive)...................................................................................................11
Semaphore ()............................................................................................................13
Waitable timer ( ).......................................................................................15
lpDueTime..........................................................................................................................16
lPeriod.................................................................................................................................16
pfnCompletionRoutine.......................................................................................................16
lpArgToCompletionRoutine...............................................................................................16
fResume..............................................................................................................................16
............................................................................18
(change notification).......................................................18
(console input)...............................................21
(Job).........................................................................................................................21
(Process)..................................................................................................................21
(thread)........................................................................................................................22
.........................................................................22
.............................................................................................................22
(Interlocked Variable Access)..................................24
............................................................................................................................................25
Windows
Windows
(
) - . Win32
,
, (,
), ,
.
,
, .
, Win32
.
Signaled Not Signaled.
, Not Signaled.
, , ,
- ,
.
, .
, Win32 API.
,
,
,
function WaitForSingleObject(
hHandle: THandle;
//
dwMilliseconds: DWORD
//
): DWORD; stdcall;
hHandle
dwMilliseconds . dwMilliseconds
INFINITE, . dwMilliseconds
0, .
:
WAIT_ABANDONED
, , ,
.
WAIT_OBJECT_0
WAIT_TIMEOUT
.
,
WAIT_FAILED
, hHandle.
, GetLastError
Windows
Action1 ObjectHandle
. , ,
ObjectHandle , CreateProcess.
var
Reason: DWORD;
ErrorCode: DWORD;
Action1.Enabled := FALSE;
try
repeat
Application.ProcessMessages;
Reason := WailForSingleObject(ObjectHandle, 10);
if Reason = WAIT_FAILED then begin
ErrorCode := GetLastError;
raise Exception.CreateFmt(
Wait for object failed with error: %d, [ErrorCode]);
end;
until Reason <> WAIT_TIMEOUT;
finally
Actionl.Enabled := TRUE;
end;
, ,
:
function SignalObjectAndWait(
hObjectToSignal: THandle; //
//
hObjectToWaitOn: THandle; //
dwMilliseconds: DWORD;
//
bAlertable: BOOL
//
//
//
): DWORD; stdcall;
,
,
,
-
WaitForSingleObject.
!
Windows.pas ,
BOOL.
DWORD
hObjectToSignal , (event), .
bAlertable , , ,
-,
. .
,
. :
type
TWOHandleArray = array[0..MAXIMUM_WAIT_OBJECTS - 1] of THandle;
PWOHandleArray = ^TWOHandleArray;
function WaitForMultipleObjects(
nCount: DWORD;
//
lpHandles: PWOHandleArray; //
bWaitAll: BOOL;
// ,
Windows
dwMilliseconds: DWORD
): DWORD; stdcall;
//
//
:
WAIT_OBJECT_0
WAIT_OBJECT_0 + nCount 1
bWaitAll TRUE, ,
.
WAIT_ABANDONED_0
WAIT_ABANDONED_0 + nCount
1
bWaitAll TRUE ,
,
,
.
FALSE ,
WAIT_OBJECT_0,
lpHandles.
FALSE ,
WAIT_ABANDONED_0,
lpHandles, , ,
, .
WAIT_TIMEOUT
WAIT_FAILED
,
, .
var
Handles: array[0..1] of THandle;
Reason: DWORD;
RestIndex: Integer;
...
Handles[0] := OpenMutex(SYNCHRONIZE, FALSE, FirstResource);
Handles[1] := OpenMutex(SYNCHRONIZE, FALSE, SecondResource);
//
Reason := WaitForMultipleObjects(2, @Handles, FALSE, INFINITE);
case Reason of
WAIT_FAILED: RaiseLastWin32Error;
WAIT_OBJECT_0, WAIT_ABANDONED_0:
begin
ModifyFirstResource;
RestIndex := 1;
end;
WAIT_OBJECT_0 + 1, WAIT_ABANDONED_0 + 1:
begin
ModifySecondResource;
RestIndex := 0;
end;
// WAIT_TIMEOUT
end;
//
if WailForSingleObject(Handles[RestIndex],
INFINITE) = WAIT_FAILED then
RaiseLastWin32Error;
// , .
if RestIndex = 0 then
Windows
ModifyFirstResource
else
ModifySecondResource;
, ,
.
.
,
Windows.
( , WAIT_TIMEOUT),
:
function MsgWaitForMultipleObjects(
nCount: DWORD;
//
var pHandles;
//
fWaitAll: BOOL;
// ,
//
dwMilliseconds,
//
dwWakeMask: DWORD // ,
): DWORD; stdcall;
dwWakeMask,
QS_XXX ,
, . ,
QS_KEY WM_KEYUP,
WM_KEYDOWN, WM_SYSKEYUP WM_SYSKEYDOWN, QS_PAINT WM_PAINT. , dwWakeMask
Windows SDK. , ,
,
WAIT_OBJECT_0 + nCount. ,
. .
,
, .
procedure TForm1.Button1Click(Sender: TObject);
var
PI: TProcessInformation;
SI: TStartupInfo;
Reason: DWORD;
Msg: TMsg;
begin
// TStartupInfo
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
//
Win32Check(CreateProcess(NIL, 'COMMAND.COM', NIL,
NIL, FALSE, 0, NIL, NIL, SI, PI));
//**************************************************
//
// WaitForSingleObject(PI.hProcess, INFINITE);
// ,
//
//**************************************************
repeat
//
// WM_PAINT
Reason := MsgWaitForMultipleObjects(1, PI.hProcess, FALSE,
INFINITE, QS_PAINT);
Windows
if Reason = WAIT_OBJECT_0 + 1 then begin
// WM_PAINT Windows
// .
//
PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE);
//
Update;
end;
// ,
until Reason = WAIT_OBJECT_0;
//
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do;
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread)
end;
, ( CreateWindow)
( TForm, DDE, COM) Windows
.
, , ( ,
,
) Windows.
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx .
.
APC
Windows .
(thread) (APC queue).
( ,
QueueUserAPC)
. ,
. , ,
:
function SleepEx(
dwMilliseconds: DWORD;
bAlertable: BOOL
//
//
//
//
): DWORD; stdcall;
function WaitForSingleObjectEx(
hHandle: THandle;
//
dwMilliseconds: DWORD; //
bAlertable: BOOL
// ,
//
//
): DWORD; stdcall;
function WaitForMultipleObjectsEx(
nCount: DWORD;
//
lpHandles: PWOHandleArray;//
bWaitAll: BOOL;
// ,
Windows
dwMilliseconds: DWORD;
bAlertable: BOOL
): DWORD; stdcall;
//
//
//
//
//
function SignalObjectAndWait(
hObjectToSignal: THandle; //
//
hObjectToWaitOn: THandle; //
dwMilliseconds: DWORD;
//
bAlertable: BOOL
//
//
//
): DWORD; stdcall;
,
,
,
function MsgWaitForMultipleObjectsEx(
nCount: DWORD;
//
var pHandles;
//
fWaitAll: BOOL;
// ,
//
dwMilliseconds,
//
dwWakeMask: DWORD // ,
dwFlags: DWORD
//
): DWORD; stdcall;
bAlertable
TRUE
(
dwFlags
MsgWaitForMultipleObjectsEx MWMO_ALERTABLE) ,
APC
,
WAIT_IO_COMPLETION.
, , -.
-
ReadFileEx WriteFileEx, -
.
. , ,
, ,
, -.
APC , ,
-.
Windows,
. ,
,
, . :
Event ()
. Event
Windows
,
ResetEvent
,
.
:
function CreateEvent(
lpEventAttributes: PSecurityAttributes;
bManualReset,
bInitialState: BOOL;
lpName: PChar
): THandle; stdcall;
//
//
//
//
//
//
//
//
// TSecurityAttributes
, Event
(TRUE) (FALSE)
. TRUE
NIL,
TSecurityAttributes , :
TSecurityAttributes = record
nLength: DWORD;
//
//
//
lpSecurityDescriptor: Pointer; //
//
//
bInheritHandle: BOOL;
//
//
end;
,
SizeOf(TSecurityAttributes)
.
Windows 95 98
NIL
,
Windows NT
, lpEventAttributes
NIL.
.
lpName . lpName
Event,
, ,
. bManualReset, bInitialState
lpSecurityDescriptor. , ,
:
hEvent := CreateEvent(NIL, TRUE, FALSE, EventName);
if hEvent = 0 then
RaiseLastWin32Error;
if GetLastError = ERROR_ALREADY_EXISTS then begin
//
end;
,
.
Semaphore, Mutex, Job, Waitable Timer FileMapping. ,
.
Windows
, Event ,
CreateEvent :
function OpenEvent(
dwDesiredAccess: DWORD;
bInheritHandle: BOOL;
lpName: PChar
): THandle; stdcall;
//
//
//
//
, 0, .
dwDesiredAccess :
EVENT_ALL_ACCESS
EVENT_MODIFY_STA
TE
SetEvent ResetEvent
SYNCHRONIZE
Windows NT
.
:
function SetEvent(hEvent: THandle): BOOL; stdcall;
function ResetEvent(hEvent: THandle): BOOL; stdcall;
,
function PulseEvent(hEvent: THandle): BOOL; stdcall
, ,
, .
WinAPI , -.
,
, .
, .
var
Events: array[0..1] of THandle; //
Overlapped: array[0..1] of TOverlapped;
...
//
Events[0] := CreateEvent(NIL, TRUE, FALSE, NIL);
Events[1] := CreateEvent(NIL, TRUE, FALSE, NIL);
// TOverlapped
FillChar(Overlapped, SizeOf(Overlapped), 0);
Overlapped[0].hEvent := Events[0];
Overlapped[1].hEvent := Events[1];
//
WriteFile(hFirstFile, FirstBuffer, SizeOf(FirstBuffer),
FirstFileWritten, @Overlapped[0]);
WriteFile(hSecondFile, SecondBuffer, SizeOf(SecondBuffer),
10
Windows
SecondFileWritten, @Overlapped[1]);
//
WaitForMultipleObjects(2, @Events, TRUE, INFINITE);
//
CloseHandle(Events[0]);
CloseHandle(Events[1]);
, CloseHandle.
Delphi TEvent, Event.
SyncObjs.pas :
type
TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError);
TEvent = class(THandleObject)
public
constructor Create(EventAttributes: PSecurityAttributes;
ManualReset, InitialState: Boolean; const Name: string);
function WaitFor(Timeout: DWORD): TWaitResult;
procedure SetEvent;
procedure ResetEvent;
end;
.
Windows API.
.
type
TSimpleEvent = class(TEvent)
public
constructor Create;
end;
constructor TSimpleEvent.Create;
begin
FHandle := CreateEvent(nil, True, False, nil);
end;
//
// TSecurityAttributes
// ,
//
//
11
Windows
, 0.
, .
GetLastError ERROR_ALREDY_EXISTS.
Semaphore, Event, Job, Waitable Timer
FileMapping
, ,
(.. bInitialOwner
FALSE).
,
function OpenMutex(
dwDesiredAccess: DWORD;
bInheritHandle: BOOL;
lpName: PChar
): THandle; stdcall;
//
//
//
//
dwDesiredAccess
MUTEX_ALL_ACCESS
SYNCHRONIZE
Windows NT
ReleaseMutex
, 0, .
,
.
function ReleaseMutex(hMutex: THandle): BOOL; stdcall;
, , ,
,
:
var
Mutex: THandle;
//
Mutex := CreateMutex(NIL, FALSE, UniqueMutexName);
if Mutex = 0 then
RaiseLastWin32Error;
...
//
WaitForSingleObject(Mutex, INFINITE);
try
// , ,
//
// WaitForSingleObject
...
finally
// ,
//
ReleaseMutex(Mutex);
end;
...
//
CloseHandle(Mutex);
12
Windows
, ,
, ,
.
, ,
MsgWaitForSingleObject,
WaitForSingleObject , .
. try ... finally,
,
.
Semaphore ()
, 0
. ,
,
ReleaseSemaphore. 0
, .
, .
:
function CreateSemaphore(
lpSemaphoreAttributes: PSecurityAttributes; //
// TSecurityAttributes
lInitialCount,
//
lMaximumCount: Longint; //
lpName: PChar
//
): THandle; stdcall;
, 0,
.
lMaximumCount , lInitialCount
0 lMaximumCount.
lpName . ,
, .
, ,
lpName NIL.
event, mutex, waitable timer, job, file-mapping.
, , :
function OpenSemaphore(
dwDesiredAccess: DWORD;
bInheritHandle: BOOL;
lpName: PChar
): THandle; stdcall;
//
//
//
//
dwDesiredAccess :
SEMAPHORE_ALL_ACCES
S
13
Windows
SEMAPHORE_MODIFY_ST
ATE
ReleaseSemaphore
SYNCHRONIZE
Windows NT
:
function ReleaseSemaphore(
hSemaphore: THandle;
lReleaseCount: Longint;
lpPreviousCount: Pointer
//
//
//
//
//
32- ,
): BOOL; stdcall;
CreateSemaphore , ReleaseSemaphore FALSE
. lpPreviousCount NIL,
.
,
(, Internet).
,
. ,
,
.
unit LimitedThread;
interface
uses Classes;
type
TLimitedThread = class(TThread)
procedure Execute; override;
end;
implementation
uses Windows;
const
MAX_THREAD_COUNT = 10;
var
Semaphore: THandle;
procedure TLimitedThread.Execute;
begin
// .
// MAX_THREAD_COUNT 0
// .
// .
WaitForSingleObject(Semaphore, INFINITE);
// , ,
//
...
14
Windows
// ,
// .
ReleaseSemaphore(Semaphore, 1, NIL);
end;
initialization
//
Semaphore := CreateSemaphore(NIL, MAX_THREAD_COUNT,
MAX_THREAD_COUNT, NIL);
finalization
//
CloseHandle(Semaphore);
end;
Waitable timer ( )
Windows 95 Windows
98 Windows NT 4.0 .
. :
function CreateWaitableTimer(
lpTimerAttributes: PSecurityAttributes;
bManualReset: BOOL;
lpTimerName: PChar
): THandle; stdcall;
//
//
//
//
//
// TSecurityAttributes
,
bManualReset TRUE,
SetWaitableTimer, FALSE -
.
lpTimerName
,
.
event, semaphore, mutex, job file-mapping.
:
function OpenWaitableTimer(
dwDesiredAccess: DWORD; //
bInheritHandle: BOOL;
//
//
lpTimerName: PChar
//
): THandle; stdcall;
dwDesiredAccess :
TIMER_ALL_ACCESS
TIMER_MODIFY_STATE
SetWaitableTimer CancelWaitableTimer
SYNCHRONIZE
Windows NT
15
Windows
function SetWaitableTimer(
hTimer: THandle;
//
const lpDueTime: TLargeInteger;
//
lPeriod: Longint;
//
pfnCompletionRoutine: TFNTimerAPCRoutine; // -
lpArgToCompletionRoutine: Pointer;// -
fResume: BOOL
// ,
//
): BOOL; stdcall;
.
lpDueTime
. TFileTime
coordinated universal time (UTC), .. .
TFileTime SystemTimeToFileTime.
, ,
.
lPeriod
. lPeriod 0
.
pfnCompletionRoutine
, :
procedure TimerAPCProc(
lpArgToCompletionRoutine: Pointer; //
dwTimerLowValue: DWORD;
// 32
dwTimerHighValue: DWORD; // 32
); stdcall;
, , ,
, ,
. 3 :
lpArgToCompletionRoutine ,
SetWaitableTimer.
,
,
NIL.
lpArgToCompletionRoutine
pfnCompletionRoutine .
fResume
16
Windows
,
(suspended).
fResume TRUE, SetWaitableTimer
, GetLastError
ERROR_NOT_SUPPORTED.
, :
function CancelWaitableTimer(hTimer: THandle): BOOL; stdcall;
-.
CloseHandle
, ,
. ,
, .
,
, Windows.
unit WaitThread;
interface
uses Classes, Windows;
type
TWaitThread = class(TThread)
WaitUntil: TDateTime;
procedure Execute; override;
end;
implementation
uses SysUtils;
procedure TWaitThread.Execute;
var
Timer: THandle;
SystemTime: TSystemTime;
FileTime, LocalFileTime: TFileTime;
begin
Timer := CreateWaitableTimer(NIL, FALSE, NIL);
try
DateTimeToSystemTime(WaitUntil, SystemTime);
SystemTimeToFileTime(SystemTime, LocalFileTime);
LocalFileTimeToFileTime(LocalFileTime, FileTime);
SetWaitableTimer(Timer, TLargeInteger(FileTime), 0,
NIL, NIL, FALSE);
WaitForSingleObject(Timer, INFINITE);
finally
CloseHandle(Timer);
end;
end;
end.
, , :
17
Windows
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure TimerFired(Sender: TObject);
end;
...
implementation
uses WaitThread;
procedure TForm1.Button1Click(Sender: TObject);
var
T: TDateTime;
begin
with TWaitThread.Create(TRUE) do
begin
OnTerminate := TimerFired;
FreeOnTerminate := TRUE;
// 5
WaitUntil := Now + 1 / 24 / 60 / 60 * 5;
Resume;
end;
end;
procedure TForm1.TimerFired(Sender: TObject);
begin
ShowMessage('Timer fired !');
end;
Win32 API ,
. :
(change notification)
Windows .
function FindFirstChangeNotification(
lpPathName: PChar;
// ,
//
bWatchSubtree: BOOL;
//
//
dwNotifyFilter: DWORD //
): THandle; stdcall;
dwNotifyFilter :
FILE_NOTIFY_CHANGE_FILE_NAME
, ..
FILE_NOTIFY_CHANGE_DIR_NAME
18
Windows
, ..
FILE_NOTIFY_CHANGE_ATTRIBUTES
FILE_NOTIFY_CHANGE_SIZE
.
.
FILE_NOTIFY_CHANGE_LAST_WRITE
, .., ,
.
.
FILE_NOTIFY_CHANGE_SECURITY
, ,
. ,
. , :
function FindNextChangeNotification(
hChangeHandle: THandle
): BOOL; stdcall;
, :
function FindCloseChangeNotification(
hChangeHandle: THandle
): BOOL; stdcall;
,
.
TThread. Terminate
, , Execute,
Terminate. WaitForSingleObject
WaitForMultipleObjects, (event),
Terminate.
type
TCheckFolder = class(TThread)
private
FOnChange: TNotifyEvent;
Handles: array[0..1] of THandle;
//
//
procedure DoOnChange;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean;
PathToMonitor: String; WaitSubTree: Boolean;
OnChange: TNotifyEvent; NotifyFilter: DWORD);
destructor Destroy; override;
procedure Terminate;
end;
19
Windows
procedure TCheckFolder.DoOnChange;
//
// VCL, ,
// TListBox,
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
procedure TCheckFolder.Terminate;
begin
inherited; // TThread.Terminate,
// Terminated = TRUE
SetEvent(Handles[1]); //
//
end;
constructor TCheckFolder.Create(CreateSuspended: Boolean;
PathToMonitor: String; WaitSubTree: Boolean;
OnChange: TNotifyEvent; NotifyFilter: DWORD);
var
BoolForWin95: Integer;
begin
//
inherited Create(TRUE);
// Windows 95
// FindFirstChangeNotification. , ,
// :
// - lpPathName - "\"
//
// - bWatchSubtree - TRUE BOOL(1)
if WaitSubTree then
BoolForWin95 := 1
else
BoolForWin95 := 0;
if (Length(PathToMonitor) > 1) and
(PathToMonitor[Length(PathToMonitor)] = \) and
(PathToMonitor[Length(PathToMonitor)-1] <> :) then
Delete(PathToMonitor, Length(PathToMonitor), 1);
Handles[0] := FindFirstChangeNotification(
PChar(PathToMonitor), BOOL(BoolForWin95), NotifyFilter);
Handles[1] := CreateEvent(NIL, TRUE, FALSE, NIL);
FOnChange := OnChange;
// , ,
if not CreateSuspended then
Resume;
end;
destructor TCheckFolder.Destroy;
begin
FindCloseChangeNotification(Handles[0]);
CloseHandle(Handles[1]);
inherited;
end;
procedure TCheckFolder.Execute;
20
Windows
var
Reason: Integer;
Dummy: Integer;
begin
repeat
// ,
//
Reason := WaitForMultipleObjects(2, @Handles, FALSE, INFINITE);
if Reason = WAIT_OBJECT_0 then begin
// ,
//
Synchronize(DoOnChange);
//
FindNextChangeNotification(Handles[0]);
end;
until Terminated;
end;
TThread.Terminate ,
TThread, .. Terminate TThread,
, ,
.
(console input)
, ,
GetStdHandle(STD_INPUT_HANDLE), .
,
, . , ,
WaitForMultipleObjects -
.
(Job)
Job Windows 2000,
.
, ,
.
(Process)
, CreateProcess,
.
, , .
var
PI: TProcessInformation;
SI: TStartupInfo;
...
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
Win32Check(CreateProcess(NIL, 'COMMAND.COM', NIL,
NIL, FALSE, 0, NIL, NIL, SI, PI));
//
WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
21
Windows
,
. ,
, ,
, MsgWaitForMultipleObjects.
(thread)
,
. .
, , ,
, ,
.
,
. ,
, ,
, .
:
procedure InitializeCriticalSection(
var lpCriticalSection: TRTLCriticalSection
); stdcall;
,
:
procedure EnterCriticalSection(
var lpCriticalSection: TRTLCriticalSection
); stdcall;
,
.
,
.
, ,
EnterCriticalSection .
:
procedure LeaveCriticalSection(
var lpCriticalSection: TRTLCriticalSection
); stdcall;
EnterCriticalSection. ,
, .
, , ,
.
.
:
function TryEnterCriticalSection(
var lpCriticalSection: TRTLCriticalSection
22
Windows
): BOOL; stdcall;
, .
FALSE, TRUE.
,
:
procedure DeleteCriticalSection(
var lpCriticalSection: TRTLCriticalSection
); stdcall;
,
. BytesSummary TimeSummary
.
.
.
var
//
CriticalSection: TRTLCriticalSection;
BytesSummary: Cardinal;
TimeSummary: TDateTime;
AverageSpeed: Float;
...
//
InitializeCriticalSection(CriticalSection);
BytesSummary := 0;
TimeSummary := 0;
AverageSpeed := 0;
// Execute , .
repeat
BytesRead := ReadDataBlockFromNetwork;
EnterCriticalSection(CriticalSection);
try
BytesSummary := BytesSummary + BytesRead;
TimeSummary := TimeSummary + (Now - ThreadStartTime);
if TimeSummary > 0 then
AverageSpeed := BytesSummary / (TimeSummary/24/60/60);
finally
LeaveCriticalSection(CriticalSection)
end;
until LoadComplete;
//
DeleteCriticalSection(CriticalSection);
Delphi , .
SyncObjs.pas
type
TCriticalSection = class(TSynchroObject)
public
constructor Create;
destructor Destroy; override;
procedure Acquire; override;
procedure Release; override;
23
Windows
procedure Enter;
procedure Leave;
end;
24
Windows
function InterlockedIncrement(
var Addend: Integer
): Integer; stdcall;
Addend 1.
:
Windows 98, Windows NT 4.0
Addend
Windows 95, Windows NT 3.51
Addend < 0 ,
Addend
Addend = 0 0
Addend > 0 ,
Addend.
function InterlockedDecrement(
var Addend: Integer
): Integer; stdcall;
Addend 1.
InterlockedIncrement.
function InterlockedExchange(
var Target: Integer;
Value: Integer
): Integer; stdcall;
Target Value
Target
Windows 98 Windows NT 4.0 .
function InterlockedCompareExchange(
var Destination: Pointer;
Exchange: Pointer;
Comperand: Pointer
): Pointer; stdcall;
Destination Comperand. ,
Exchange Destination. Destination.
function InterlockedExchangeAdd(
Addend: PLongint;
Value: Longint
): Longint; stdcall;
, Addend Value
Addend.
Win32
.
,
,
,
,
. :
25
Windows
,
, .
(event) -
.
32-
,
.
Win32
.
.
( , CoInitialize DDE)
.
. MsgWaitForXXX
26