W
wpy020327
Unregistered / Unconfirmed
GUEST, unregistred user!
用统一接口标准的DLL模块作为插件,主程序则是与业务逻辑无关的部分。
这样的每个插件都可以实现某一种业务逻辑,其最终的效果是业务逻辑与主程序的分离。
这种插件机制典型的例子如:Web中的WebService、中间件技术中的业务逻辑部件等等。
下面是我做的一个插件例子(我所开发的中间件所支持的一种插件):
//
// -----------------------------------------------------------------------------------
//
// *********** 远程鼠标控制插件 ***********************
//
// 本程序是一个中间件的插件编写实例。完成远程节点鼠标控制功能。
//
// 编写时间: 2007年6月
//
//
// 导出函数原型:
//
// RemoteFunction: function(AdoConn: TAdoConnection;
// InText: string;
// InStream: TMemoryStream;
// var OutText: string;
// var OutStream: TMemoryStream): boolean;
stdcall
//
// 其中入口参数:
//
// AdoConn:TAdoConnection类的实例,是直接调用该模块的远程节点系统的数据源
// InText:TString类型的变量,包含有向本类模块提供的所有简单类型参数,中间以#9字符分隔
// InStream:TStream类的实例,包含可能存在的二进制类型的入口参数,若为nil,表示不存在
//
// 其中出口参数:
//
// OutText:本模块处理结束后得到的简单类型结果数据,若有多项,以#9分隔
// OutStream:本模块处理结束之后得到的二进制类型的结果,若不存在,返回nil
//
// -----------------------------------------------------------------------------------
//
library RemoteMouse;
uses
sharemem,
SysUtils,
Classes,
Windows,
forms,
graphics,
AdoDB;
{$R *.RES}
const
CAPTUREBLT = $40000000;
//
// 主函数...
function RemoteProcess(AdoConn: TAdoConnection;
InText: string;
InStream: TMemoryStream;
var OutText: string;
var OutStream: TMemoryStream): boolean;
stdcall;
var
tmpstr: string;
j,mmode,x,y,w,h: integer;
begin
//
// 取事件类别...
tmpstr:=intext;
j:=pos(#9,tmpstr);
if j<=1 then
mmode:=-1
else
try
mmode:=strtoint(copy(tmpstr,1,j-1));
except
mmode:=-1;
end;
delete(tmpstr,1,j);
//
// 取X...
j:=pos(#9,tmpstr);
if j<=1 then
x:=-1
else
try
x:=strtoint(copy(tmpstr,1,j-1));
except
x:=-1;
end;
delete(tmpstr,1,j);
//
// 取Y...
j:=pos(#9,tmpstr);
if j<=1 then
y:=-1
else
try
y:=strtoint(copy(tmpstr,1,j-1));
except
y:=-1;
end;
delete(tmpstr,1,j);
//
// 取窗口宽...
j:=pos(#9,tmpstr);
if j<=1 then
w:=-1
else
try
w:=strtoint(copy(tmpstr,1,j-1));
except
w:=-1;
end;
delete(tmpstr,1,j);
//
// 取窗口高...
j:=pos(#9,tmpstr);
if j>0 then
tmpstr:=copy(tmpstr,1,j-1);
if trim(tmpstr)='' then
h:=-1
else
try
h:=strtoint(tmpstr);
except
h:=-1;
end;
//
// 计算实际的x,y...
x:=round(x/w*screen.Width);
y:=round(y/h*screen.Height);
SetCursorPos(x,y);
//
// 根据命令不同分别处理...
outtext:='OK';
case mmode of
//
// 左键单击...
1: begin
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;
//
// 右键单击...
2: begin
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
end;
//
// 左键双击...
3: begin
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;
//
// 其它...
else
outtext:='FAIL';
end;
//
// 返回成功代码...
result:=true;
end;
//
// 向主程序提供的函数或过程的输出声明...
exports
RemoteProcess;
//
// 初始化代码...
begin
//
end.
这样的每个插件都可以实现某一种业务逻辑,其最终的效果是业务逻辑与主程序的分离。
这种插件机制典型的例子如:Web中的WebService、中间件技术中的业务逻辑部件等等。
下面是我做的一个插件例子(我所开发的中间件所支持的一种插件):
//
// -----------------------------------------------------------------------------------
//
// *********** 远程鼠标控制插件 ***********************
//
// 本程序是一个中间件的插件编写实例。完成远程节点鼠标控制功能。
//
// 编写时间: 2007年6月
//
//
// 导出函数原型:
//
// RemoteFunction: function(AdoConn: TAdoConnection;
// InText: string;
// InStream: TMemoryStream;
// var OutText: string;
// var OutStream: TMemoryStream): boolean;
stdcall
//
// 其中入口参数:
//
// AdoConn:TAdoConnection类的实例,是直接调用该模块的远程节点系统的数据源
// InText:TString类型的变量,包含有向本类模块提供的所有简单类型参数,中间以#9字符分隔
// InStream:TStream类的实例,包含可能存在的二进制类型的入口参数,若为nil,表示不存在
//
// 其中出口参数:
//
// OutText:本模块处理结束后得到的简单类型结果数据,若有多项,以#9分隔
// OutStream:本模块处理结束之后得到的二进制类型的结果,若不存在,返回nil
//
// -----------------------------------------------------------------------------------
//
library RemoteMouse;
uses
sharemem,
SysUtils,
Classes,
Windows,
forms,
graphics,
AdoDB;
{$R *.RES}
const
CAPTUREBLT = $40000000;
//
// 主函数...
function RemoteProcess(AdoConn: TAdoConnection;
InText: string;
InStream: TMemoryStream;
var OutText: string;
var OutStream: TMemoryStream): boolean;
stdcall;
var
tmpstr: string;
j,mmode,x,y,w,h: integer;
begin
//
// 取事件类别...
tmpstr:=intext;
j:=pos(#9,tmpstr);
if j<=1 then
mmode:=-1
else
try
mmode:=strtoint(copy(tmpstr,1,j-1));
except
mmode:=-1;
end;
delete(tmpstr,1,j);
//
// 取X...
j:=pos(#9,tmpstr);
if j<=1 then
x:=-1
else
try
x:=strtoint(copy(tmpstr,1,j-1));
except
x:=-1;
end;
delete(tmpstr,1,j);
//
// 取Y...
j:=pos(#9,tmpstr);
if j<=1 then
y:=-1
else
try
y:=strtoint(copy(tmpstr,1,j-1));
except
y:=-1;
end;
delete(tmpstr,1,j);
//
// 取窗口宽...
j:=pos(#9,tmpstr);
if j<=1 then
w:=-1
else
try
w:=strtoint(copy(tmpstr,1,j-1));
except
w:=-1;
end;
delete(tmpstr,1,j);
//
// 取窗口高...
j:=pos(#9,tmpstr);
if j>0 then
tmpstr:=copy(tmpstr,1,j-1);
if trim(tmpstr)='' then
h:=-1
else
try
h:=strtoint(tmpstr);
except
h:=-1;
end;
//
// 计算实际的x,y...
x:=round(x/w*screen.Width);
y:=round(y/h*screen.Height);
SetCursorPos(x,y);
//
// 根据命令不同分别处理...
outtext:='OK';
case mmode of
//
// 左键单击...
1: begin
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;
//
// 右键单击...
2: begin
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
end;
//
// 左键双击...
3: begin
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;
//
// 其它...
else
outtext:='FAIL';
end;
//
// 返回成功代码...
result:=true;
end;
//
// 向主程序提供的函数或过程的输出声明...
exports
RemoteProcess;
//
// 初始化代码...
begin
//
end.