home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2000 October
/
Chip_2000-10_cd1.bin
/
zkuste
/
Delphi
/
navody
/
multithread
/
mchpipeinterface2.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1999-05-10
|
6KB
|
184 lines
{ 10-05-1999 10:36:26 PM > [martin on MARTIN] checked out /Reformatting
according to Delphi guidelines. }
{ 14-04-1999 11:59:06 PM > [martin on MARTIN] update: Changing dynamic
methods to virtual. (0.1) / }
{ 14-04-1999 11:52:47 PM > [martin on MARTIN] checked out /Changing dynamic
methods to virtual. }
{ 06-04-1999 1:46:38 AM > [martin on MARTIN] check in: (0.0) Initial Version
/ None }
unit MCHPipeInterface2;
{Martin Harvey 23/9/1998}
{Another interface unit, but one that allows for dynamic loading of the DLL}
interface
uses MCHPipeTypes,SysUtils;
function LoadPipeDLL:boolean;
function UnloadPipeDLL:boolean;
{Load and unload functions automatically call initialise and finalise DLL procs}
{All the functions below will also raise EDLLNotLoaded}
function ConnectServer(var hHandle:TMCHHandle):TMCHError;
{Returns error if server already connected}
function ConnectClient(var hHandle:TMCHHandle):TMCHError;
{Returns error if client already connected}
function WriteData(hHandle:TMCHHandle;var Buf;Count:integer):TMCHError;
{Returns error if client or server not connected (or disconnects during block)
Blocks if buffer full}
function ReadData(hHandle:TMCHHandle;var Buf;Count:integer):TMCHError;
{Returns error if client or server not connected (or disconnects during block)
Blocks if buffer empty}
function PeekData(hHandle:TMCHHandle;var BytesReady:integer):TMCHError;
{Returns error if client or server not connected, never blocks}
function WaitForPeer(hHandle:TMCHHandle):TMCHError;
{Lets a thread wait for the peer to connect}
function DisconnectServer(hHandle:TMCHHandle):TMCHError;
{Returns error if server not connected, or bad handle}
function DisconnectClient(hHandle:TMCHHandle):TMCHError;
{Returns error if client not connected or bad handle}
function GetDLLLoaded:boolean;
implementation
uses Windows;
type
ConnectProc = function(var hHandle:TMCHHandle):TMCHError stdcall;
DisconnectProc = function(hHandle:TMCHHandle):TMCHError;stdcall;
DataProc = function(hHandle:TMCHHandle;var Buf;Count:integer):TMCHError stdcall;
PeekProc = function(hHandle:TMCHHandle;var BytesReady:integer):TMCHError stdcall;
ProcNoParams = procedure stdcall;
var
InitProc,FinalProc:ProcNoParams;
ConnectServerProc,ConnectClientProc:ConnectProc;
DisconnectServerProc,DisconnectClientProc:DisconnectProc;
WaitForPeerProc:DisconnectProc;
WriteDataProc,ReadDataProc:DataProc;
PeekDataProc:PeekProc;
DLLLoaded:boolean;
DLLInstanceHandle:THandle;
function GetDLLLoaded:boolean;
begin
result := DLLLoaded;
end;
function LoadPipeDLL:boolean;
begin
result := false;
DLLInstanceHandle := LoadLibrary(PipeDLLName);
if DLLInstanceHandle <> 0 then
begin
InitProc := GetProcAddress(DLLInstanceHandle, 'Initialise');
FinalProc := GetProcAddress(DLLInstanceHandle, 'Finalise');
ConnectServerProc := GetProcAddress(DLLInstanceHandle, 'ConnectServer');
ConnectClientProc := GetProcAddress(DLLInstanceHandle, 'ConnectClient');
DisconnectServerProc := GetProcAddress(DLLInstanceHandle, 'DisconnectServer');
DisconnectClientProc := GetProcAddress(DLLInstanceHandle, 'DisconnectClient');
WaitForPeerProc := GetProcAddress(DLLInstanceHandle, 'WaitForPeer');
WriteDataProc := GetProcAddress(DLLInstanceHandle, 'WriteData');
ReadDataProc := GetProcAddress(DLLInstanceHandle, 'ReadData');
PeekDataProc := GetProcAddress(DLLInstanceHandle, 'PeekData');
result := true;
InitProc;
end;
DLLLoaded := result;
end;
function UnLoadPipeDLL:boolean;
begin
result := false;
if DLLLoaded then
begin
FinalProc;
result := FreeLibrary(DLLInstanceHandle);
DLLLoaded := false;
end;
end;
function ConnectServer(var hHandle:TMCHHandle):TMCHError;
{Returns error if server already connected}
begin
if DLLLoaded then
result := ConnectServerProc(hHandle)
else
result := meDLLNotLoaded;
end;
function ConnectClient(var hHandle:TMCHHandle):TMCHError;
{Returns error if client already connected}
begin
if DLLLoaded then
result := ConnectClientProc(hHandle)
else
result := meDLLNotLoaded;
end;
function DisconnectServer(hHandle:TMCHHandle):TMCHError;
{Returns error if server not connected, or bad handle}
begin
if DLLLoaded then
result := DisconnectServerProc(hHandle)
else
result := meDLLNotLoaded;
end;
function DisconnectClient(hHandle:TMCHHandle):TMCHError;
{Returns error if client not connected or bad handle}
begin
if DLLLoaded then
result := DisconnectClientProc(hHandle)
else
result := meDLLNotLoaded;
end;
function WriteData(hHandle:TMCHHandle;var Buf;Count:integer):TMCHError;
{Returns error if client or server not connected (or disconnects during block)
Blocks if buffer full}
begin
if DLLLoaded then
result := WriteDataProc(hHandle,Buf,Count)
else
result := meDLLNotLoaded;
end;
function ReadData(hHandle:TMCHHandle;var Buf;Count:integer):TMCHError;
{Returns error if client or server not connected (or disconnects during block)
Blocks if buffer empty}
begin
if DLLLoaded then
result := ReadDataProc(hHandle,Buf,Count)
else
result := meDLLNotLoaded;
end;
function PeekData(hHandle:TMCHHandle;var BytesReady:integer):TMCHError;
{Returns error if client or server not connected, never blocks}
begin
if DLLLoaded then
result := PeekDataProc(hHandle,BytesReady)
else
result := meDLLNotLoaded;
end;
function WaitForPeer(hHandle:TMCHHandle):TMCHError;
{Lets a thread wait for the peer to connect}
begin
if DLLLoaded then
result := WaitForPeerProc(hHandle)
else
result := meDLLNotLoaded;
end;
begin
DLLLoaded := false;
end.